Отправляет email-рассылки с помощью сервиса Sendsay

Delphi - проблемы и решения

  Все выпуски  

Проблемы и решения в Delphi #14


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Проблемы и решения в Delphi - выпуск 14 от 20.04.2001.


Коллектив - это сила, а вот
у металлургов она в плавках.

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС


Доброго Вам времени суток уважаемый читатель.

Сразу по поводу коллектива. Очень многие интетресуются доступом
к базам данных в обход BDE. На этом фоне я тоже заинтересовался
этим вопросом и решил его изучить поподробней. Поэтому прошу
всех кто пробовал какие-то компоненты обеспечивающие такой доступ,
(бесплатные) присылать мне(до 10 Мб) или ссылочки на дистрибы(ftp).
Желательно с краткими комментариями. Обобщив полученный материал
сделаю пару выпусков на эту тему!

Ну и довайте еще один рывок с публикацией ответов.


Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Отвеченные вопросы.
2. Очередные вопросы.
3. Ищу подельника.
~~~~~~~~~~~~~~~~~~~


1. Отвеченные вопросы.
----------------


Вопрос 51:

От: oleg_zeos

Скажите пожайлуста как работать с компонентой WordParagraphFormat для
создания и форматирования новых параграфов.

Ответить.

Ответ 1:


Вопрос 52:

От: Vladiator

После недолгого разбирательства внедрил в свою программу "предпросмотр".
Однако родился вопрос: я ведь могу с помощью QuickRep1 только смотреть, как
будет выглядеть страница. А, можно, скажем, во время работы изменить
значение размеров полей, добавить номера страниц и т.д.? Иначе какой смысл
использовать предпросмотр?!
И еще, там имеются кнопки, подписи (hint) к которым сделаны на английском.
Могу ли я их "перевести" - программа-то моя русская. Да и кнопки save и open
мне там не очень нужны. Что можете посоветовать?
Оптимально, мне нужен "предпросмотр" как в любом текстовом редакторе -
notepad, word.


Ответить.

Ответ 1:
Номера страниц можно добавить положив еещ одну компоненту
QRSysData
Ответ 2:
Можно сформировать отчет в Word
из Delphi, открыть его в Word, а там уж
пусть меняют, что хотят. Это делается с
помощью компонентов TWordApplication,
TWordDocument на панели Servers.
Ответ 3:
Есть очень замечательный генератор отчетов - FastReport.
Он предназначен для построения отчетов, представляет собой сочетание
дизайнера, генератора и Preview отчетов. Здесь вы найдете все что вам
необходимо.
Компоненты можно посмотреть здесь http://www.fastreport.ru/rus/index.shtml
Ответ 4:
> После недолгого разбирательства внедрил в свою программу "предпросмотр".
> Однако родился вопрос: я ведь могу с помощью QuickRep1 только смотреть, как
> будет выглядеть страница. А, можно, скажем, во время работы изменить
> значение размеров полей, добавить номера страниц и т.д.? Иначе какой смысл
> использовать предпросмотр?!
Можно добавлять динамически объекты в любую форму, и в QuickRep тоже.
Или просто заранее выложить туда все заголови, номера страниц и т.д.,
а в событии OnPrint проверять, нужно ли их печатать (смотря на
указания пользователя).
> И еще, там имеются кнопки, подписи (hint) к которым сделаны на английском.
> Могу ли я их "перевести" - программа-то моя русская. Да и кнопки save и open
> мне там не очень нужны. Что можете посоветовать?
Перевести -- элементарно. Открой .res ResourceWorkshop'ом или чем-то
аналогичным и переведи. У меня получалось :).
Если не нужны кнопки -- можно отключить и их, но сложнее. Самое
простое -- в ресурсном файле сдвинуть координаты этих кнопок за
пределы окна. Тогда их не будет видно :)
> Оптимально, мне нужен "предпросмотр" как в любом текстовом редакторе -
> notepad, word.
А в чем отличия?
Ответ 5:
>я ведь могу с помощью QuickRep1 только смотреть, как
>будет выглядеть страница. А, можно, скажем, во время работы изменить
>значение размеров полей
Ну почему же только смотреть......
Например:
QRRichText1.Heigth:=
QRRichText1.Lines.LoadFromFile()
QRImage1.Left:=
QRLabel1.Caption:=''
и т.д. и т.п.

> добавить номера страниц и т.д.
Можно ли через св-ва самого QuickRep - не знаю , но точно можно
поюзать QRSysData : QRSysData1.Data:=qrsPageNumber

>И еще, там имеются кнопки, подписи (hint) к которым сделаны на английском.
>Могу ли я их "перевести" - программа-то моя русская.
Я думаю - это вряд ли...
Попробуйте поискать расширенные QR сомпоненты . В RX к сожалению -
нету :(

А вааще ежели так хоца ВСЁ менять в RunTime просто сделайте ваш QR
видимым (поместить на видимую форму)..........
Ответ 6:
Для создания своего предпросмотра надо использовать не метод Preview, а компонент TQRPreview. А кнопочки и надписи
какие-угодно придётся делать самому. Что касается изменения значений размеров полей, добавления номеров страниц и
т.д.: просто меняешь то, что надо у QuickReportа


Вопрос 53:

От: CyberZone

Здравствуйте. Мне срочно нужно узнать, как спрятать программу в трей. И
как можно ею в нем управлять.
С уважением Владимир.

Ответить.

Ответ 1:
Самый простой вариант - использовать готовую компоненту.
Например из библиотеки RX - RxTrayIcon. Свойства и методы
очень понятны и без описания.
Ответ 2:
1. В Uses добавьте ShellAPI.
2. В public или private блоке Вашей формы укажите
Tr_Icon : TIcon;
TrayIcon: TNotifyIconData;
procedure OnMessage(var Msg: TMessage); virtual;
3. Используйте ImageList в качестве контейнера для иконок, которые Вы будете использовать в Трее.
4. Создайте Popup меню для команд доступных из трея.
5. Теперь в FormCreate Вы должны выполнить следующее
FillChar(TrayIcon, SizeOf(TrayIcon), 0);
Tr_Icon := TIcon.Create; //Создаем иконку
IconsList.GetIcon(0, Tr_Icon); //и загружаем ее из ImageList

TrayIcon.cbSize:=SizeOf(TrayIcon);
TrayIcon.Wnd:=AllocateHwnd(OnMessage); // My Proc OnMessage
TrayIcon.HIcon:=Tr_Icon.Handle;
StrPLCopy(TrayIcon.szTip, Application.Title, SizeOf(TrayIcon.szTip)-1);
TrayIcon.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
TrayIcon.uCallbackMessage:=Wm_Callback_Msg;
Shell_NotifyIcon(NIM_ADD, @TrayIcon); // ВСЕ!!! Мы создали иконку в трее
6. В FormDestroy добавляем строку
Shell_NotifyIcon(NIM_DELETE, @TrayIcon);

7. Нам осталось описать процедуру onMessage

procedure TForm1.OnMessage(var Msg: TMessage);
procedure ShowPopup;
var
x, y : integer;
begin
x := GetSystemMetrics(SM_CXFULLSCREEN);
y := GetSystemMetrics(SM_CYFULLSCREEN) + GetSystemMetrics(SM_CYCAPTION);
PopupMenu1.Popup(x, y)
end;
begin
case Msg.Msg of
procedure TGepardManagerForm.OnMessage(var Msg: TMessage);
begin
case Msg.Msg of
Wm_Callback_Msg: case Msg.lParam of
Wm_LButtonDblClk : Show;
Wm_RButtonDown : ShowPopup;
end;
Wm_EndSession: Shell_NotifyIcon(NIM_DELETE, @TrayIcon);
Wm_QueryEndSession: ;
Wm_Size : ;
Wm_ActivateAPP : ;
end;
end;
Если у Вас в IconList сродержится несколько иконок Вы в любой момент можете выполнить
IconsList.GetIcon(n, Tr_Icon); // Здесь n - номер данной иконки в IconList
TrayIcon.HIcon:=Tr_Icon.Handle;
Shell_NotifyIcon(NIM_MODIFY, @TrayIcon);
и у Вас в трее изменилась иконка !


Вопрос 54:

От: Sherkunov Ruslan

Как запустить файл, который находиться в папке текущего каталога. Папка
будет находиться на CD, поэтому прямой путь указать нельзя.


Ответить.

Ответ 1:
Не совсем понятен вопрос.
Вообще для запуска программы из Delphi можно использовать
ShellExecute(h,'open','my.exe',nil,nil,SW_RESTORE).
Если специально путь не прописывать, то запустится из текущего.
Ответ 2:
Получить путь к директории, из которой был запущен файл можно следующим образом:
s:=ExtractFilePath(Application.EXEName);

Вопрос 55:

От: MiTyI

В моей программе желательно запретить возможность развертывания окна
проги на весь экран.
Т.е. заблокировать команду "Развернуть" и "Размер".

Желательно пример кода.



Ответить.

Ответ 1:
Ребята, вы чего? Да нормально на такие вопросы никогда отвечать не будут!
Спрашивать ТАКОЕ!
Есть несколько путей решения:
1. F1
2. Купить ЛЮБУЮ книгу по Delphi, в них, обычно, всегда вначале такое все
расписано.
3. Подписаться на конференцию fido7.ru.delphi (правда там сразу с такими
вопросами в Пьяного Дельфина запишут или просто проигнорируют или, еще
вариант, получишь ответ: RTFM)
А решения не жди, грех на такое отвечать.
Ответ 2:
Смею напомнить, что рассылка для начинающих.
Можно вот так решить задачку :
DeleteMenu(hMenuHandle, SC_MAXIMIZE, MF_BYCOMMAND);
DeleteMenu(hMenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
Ответ 3:
В свойствах формы устанавливаете
BorderStyle := bsDialog
Ответ 4:
Form1.BorderStyle:=bsSingle; // Это чтобы размер нельзя было менять
Form1.BorderIcons.biMaximize:=False; // Чтобы нельзя было максимизировать
Ответ 5:
Запретить развертывание окна на весь экран и изменение
его размера можно следующим образом:
В OnCreate формы вставляется:

procedure TForm1.FormCreate(Sender: TObject);
var
hMenuHandle: HMENU;
begin
hMenuHandle := GetSystemMenu(Handle, False);
if (hMenuHandle <> 0) then
RemoveMenu(hMenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
RemoveMenu(hMenuHandle, SC_MAXIMIZE, MF_BYCOMMAND);
RemoveMenu(hMenuHandle, SC_SIZE, MF_BYCOMMAND);
end;

RemoveMenu - удаляет один пункт меню.
Также можно использовать DeleteMenu - удаляет ветвь меню.
Можно использовать для модификации любого меню, а не
только системного.


Вопрос 56:

От: Spirit

Здравствуйте! У меня такая проблема. В onPaint формы вывожу массив примитивов
TCanvas'а (кружочки, линии и т.п.). При изменении ScrollBar.Position
вывожу тот же массив с новыми координатами. Для этого, сначала закрашиваю
старый следующим образом

With Canvas do
begin
Brush.Color := clWhite;
FillRect(MainForm.ClientRect);
end;

При передвижении бегунка получается мелькание. Помогите, пожалуйста,
избежать этого!


Ответить.

Ответ 1:
Попробуй в OnCreate формы добавить DoubleBuffered := True;
Но вообще проще создать TImage, нарисовать на нем все что надо и двигать
только его. Хотя это от задачи зависит.


Вопрос 57:

От: infol

Можно ли поместить рисунок в заголовок окна, например название окна в
графике.


Ответить.

Ответ 1:
Свойство Icon у Tform.
Ответ 2:
WinAPI: см WM_NCPAINT

Вопрос 58:

От: Gorojankin Dmitri

По поводу взаимодействия с операционной системой я и
сам не до конца понял чего хочу, поэтому сразу перейду ко
второму. Серверную часть пишу не я. Приложение, о котором
идет речь, должно делать примерно следующее:
1. По указанному адресу собирать нужную информацию,
например определять наличие каких-либо ключевых слов,
ссылок, и пересылать найденное клиенту - то есть мне.
2. В програмном режиме переходить от одного адреса к
другому и собирать на них текстовую информацию.


Ответить.

Ответ 1:
Тут опять-же масса вариантов, если это интернет - поиск страничек,
то скачивать их можно через HTTP.
Если своя сеть, с заранее известными адресами, и поиск надо проводить
прямо в документах на машине, то тут просто - через зашаренные
ресурсы или посложнее - через сокеты, тогда нужна-таки серверная
часть.



Вопрос 59:

От: Nazirkulov B.A.

Здравствуйте!
Я тоже хочу программировать на Delphi. Но повашим меркам я наверное
натуральный "чайник". У меня проблемы с циклическими операциями. Я бы
очень хотел чтобы мне как нибудь помогли. Заранее благодарю.
nazir2@online.ru


Ответить.

Ответ 1:
Приведите конкретный код и опишите возникающую ошибку и уверен
получите помощь.


Вопрос 60:

От: Алексей Малиновский

Господа программисты!
Подскажите, какую директиву при компиляции программы следует поставить,
чтобы получился SCREEN SAVER?

С уважением, Алексей.


Ответить.

Ответ 1:
Чтобы получился ScreenSaver никакой директивы ставить не надо. Этот Saver,
который Screen, на самом деле самый обычный (?) exe-файл, просто с
расширением .scr - это первое. Второе, ScreenSaver запускается Windows'ом с
параметрами:
1. Р - просмотр
2. С - настройки
3. А - пароль
4. S - работа
От Вас требуется написать код, который будет адекватно реагировать на эти
самые параметры.
И ещё Хранитель должен показывать "себя" в окошке предпросмотра (на
экранчике монитора).
Ответ 2:
{$E scr}
Ответ 3:
Вот, из старого FAQ
(15.08.1995, составители: Александр Сергеев <aes@eps.compnet.ru>
Вадим Миллер <miller@bor.compnet.ru>
Dima Kuzmenko <2:5023/2.13>)


Для создания Screen Saver:
A) В проектном файле (* .dpr) напишите {$D SCRNSAVE <saver name>}
после Uses;

B) На главной форме выключите Border и иконки. Установите свойства Left и
Top в 0, WindowState в wsMaximize.

C) В обработчике события OnCreate, установите Application.OnMessage на
процедуру деактивации Screen saver. Установите Application.OnIdle на
любую процедуру для рисования на экране.

D) В обработчике OnCreate должна проверяться командная строка на наличие
ключей /c и /s. Эти параметры определяют, нужно ли запускать сам Screen
Saver или его конфигурацию (/c - конфигурация).

E) Скомпилируйте программу и переименуйте из .exe в .scr

Майк.
Ответ 4:
{$D SCRNSAVE хранитель экрана}
"Хранитель экрана" - это просто имя. где оно используется уж и не помню.
А эту директиву нужно вставлять не в модули (*.pas) а в файл проекта (*.dpr)
и еще нужно в файле проекта делать прверку
***
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
IF (ParamStr(1) = '/c') OR (ParamStr(1) = '/C') THEN
(*значит нужно запускать не сам хранитель экрана, а окно с опциями SS.
*)
Ответ 5:
Цитирую "Советы по Delphi" - там пример создания хранителя экрана:
http://www.webmachine.ru/delphi/ <http://www.webmachine.ru/delphi/>
" Директива $D вставляет текст в описание модуля выполняемого файла.
Чтобы Панель Управления "поняла" этот текст и принадлежность файла к
хранителям экрана, описание должно начинаться с зарезервированного слова
"SCRNSAVE".
Выберите пункт Project Source из меню View для редактирования исходного
кода проекта. Под директивой
"{$R *.RES}" добавьте следующую строчку:
{$D SCRNSAVE My Screen Saver} "
Получившееся расширение *.ехе переименовываешь в *.scr


Вопрос 61:

От: Алексей Малиновский


У меня возникла проблема: у меня на форме имеется много объектов
(визуальных компонентов), их имена отличаются толлько окончаниями
названий, например LabelK1, LableK2 ... LabelK16 или PanelK1, PanelK2
... PanelK16. Так вот я хочу сделать процедуру, которая бы анализировала
бы их, если каждый компонент анализировать отдельно, то это будет очень
долго и муторно... :-( А как сделать так, чтобы анализировать например
какой нибудь один компонент типа LabelKx или PanelKx, и только
подставлять x, т.е. другими словами, как мне вычислять название
компонента и работать с ним?

Ответить.

Ответ 1:
если хочешь работат с i-тым лейблом:

var L:Tlable;
begin
if (Components.FindComponent('Lable'+inttostr(i)) is TLable) then L=Components.FindComponent('Lable'+inttostr(i));

блаблабла

end;
Ответ 2:
Попробуй использовать свойство TAG компонентов.
Например, name='LabelK1', tag=1 и т.д.
Ответ 3:
Вообще говоря стройность имени компонента не имеет значенияю
Для Вас важно получить указатель на компонент, зная его имя.
Естественно, данная ниже функция только объясняет принцип работы.
Реализация необходимого Вам алгоритма перебора уже в Вашей
компетенции.
Iouri

function TForm1.GetSpecificLabel(LabelName: String): TComponent;
var
i: Integer;
begin
Result:=Nil;
for i:=0 to ComponentCount-1 do begin
if (Components[i] is TLabel) and
(Components[i].Name=LabelName) then begin
Result:=Components[i];
break;
end;
end;
end
Ответ 4:
Попробуй так:
----- CUT----

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to Form1.ControlCount -1 do
if Form1.Controls[i] is TLabel then
TLabel(Controls[i]).Caption := 'Ok';
end;

----CUT ------
Ответ 5:
Привет!
Ну вобщем существует несколько методов решения такой задачи. Нужно просто
выбрать наиболее подходящий.
1) метод
перебираем ВСЕ компоненты на форме, отбираем среди них нужные, производим с
ними действия
var
i:integer;
s:string;
c:TComponent;
begin
for i:=0 to form1.ComponentCount-1 do
begin
{определяем один из компонентов формы}
c:=Form1.Components[i];
{определяем, относится ли этот компонетн
к классу TPanel}
if (c is Tpanel) then
begin
s:=c.name; {определяем имя компонента}
{произвоим действия с компонентом...}
(c as TPanel).visible:=false;
end;
end;

2) метод
Ищем компоненты по именам, отличающимся друг от друга индексами.
var
c:TComponent;
i:integer;
begin
i:=1;
c:=Form1.FindComponent('Panel'+IntToStr(i));
while c<>nil do
begin
{таким образом, получается, что мы
ищем на все форме коммпоненты с именем
типа Panel1, Panel2, Panel3 и т.д.}
{и производим с ними какие-то действия}
(c as TPanel).visible:=false;
{если не нравится всё время писать (c as TPanel), то можно описать
переменную p:TPanel и использовать далее:
p:=(c as TPanel);
p.visible:=false. Это относится и к первому примеру}
inc(i);
c:=Form1.FindComponent('Panel'+IntToStr(i));
end;
Ответ 6:
//пусть на форме стоят 10 меток: Label1..Label10
// объявим переменные

Var i:integer;
t:Tcomponent;


//собственно код
for i:=1 to 10 do
begin
//находим компонент по имени
t:=findcomponent(Format('Label%d',[i]));
// проверим действительно ли есть компонент с
таким именем, и убедимся если он есть, то нужного нам
класса
if (t<>nil) and (t is TLabel) then
begin
// если есть то рассматриваем его как Label и
делаем что угодно, например меняем Caption
(t as TLabel).caption:=inttostr(i);
end;
end;
Ответ 7:
организуй массив из этих элементов
правда придется создавать их вручную (см. пример)
главное в разделе USES указать то DCU в котором реализованы эти
элементы (для TLABEL - StdCtrls)

unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const N = 5;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
public
Labels: array[1..N]of TLabel; //массив элементов
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
for i:=1 to N do begin
Labels[i] := TLabel.Create(self);
with Labels[i] do begin
Left := 10;
Top := i * 20;
Caption := 'Label' + IntToStr(i);
Parent := Self;
end;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var i: Integer;
begin
for i := 1 to N do Labels[i].Destroy;
end;

end.


Вопрос 62:

От: Vladiator

Добрый день!
Проблема следующая: необходимо сохранить параметры шрифта окна
StaticText2:TStaticText в файл 'emulator.cfg'. Делаю это таким образом:

--- CUT ---
var f :file;
textfont :tfont;
begin
textfont:=StaticText2.font;
assignfile(f,'emulator.cfg');
rewrite(f);
blockwrite(f,textfont,sizeof(textfont));
closefile(f);
end;
--- END CUT ---

В результате получаю файл размером 4 байта, причем к параметрам шрифта он
отношение имеет явно косвенное.
Подскажите, пожалуйста, что я сделал неправильно.


Ответить.

Ответ 1:
Боюсь Вам придется по отдельности сохранять все свойства шрифта
для этого лучше всего использовать TiniFile
uses inifiles
............
procedure TForm1.aaa;
var MyIni:TMyIniFile;
begin
// пытаемся создать свой экземпляр
try
Myini:=TMyInifile.create('emulator.cfg');
exept
// если не вышло...
.....
end;

Myini.writestring('font','Charset',stattext.font.Charset);
Myini.writeinteger('font','Height',stattext.font.Height);
// ну и так далее

Myini.free;
end;

а читать соответсвенно
stattext.font.Charset:=Myini.readstring('font','Charset',stattext.font.Charset);
// последний параметр нужен в случае, когда параметр 'Charset' не содержится в файле

при всем этом, Вас не должно беспокоить наличие/отсутствие файла,
так как он создается автоматически.
Ответ 2:
Вы сохраняете значения указателя.
Попробуйте такую строчку
blockwrite(f,textfont.size,sizeof(textfont.size));
Остальные строки добавите самостоятельно
Ответ 3:
TFont это ссылка на объект, которя занимает 4 байта. Чтобы сохранить
шрифт надо сохранять каждое свойство по отдельности. (Строки - это тоже
ссылки короме ShortString).
Лучше всего создать Record который бы не содержал длинных строк,
динамических массивов и прочих типов, которые представляют собой
указатели, скопировать в нее нужные свойства TFont и сохранить ее.
Ответ 4:
Разумеется, ты записываешь указатель на TFont
У TFont есть свои методы для записи и загрузки себя из потока в т.ч.
файла (имена методов, прости, не помню)
Ответ 5:
Если уж на то дело пошло, то переменную f нужно описывать не как File, а как
File of TFont. Т.е. как структурный файл.
Да и вобще TFont - это он или сам является всего лишь указателем (отсюда и
маленький размер файла) или содержит в себе указатели.
Например имя ширфта - тип string, а в Delphi это по умолчанию всего лишь
указатель.

По-моему таким образом сохранить шрифт в файле вообще нельзя.
А сохранить можно, если специально сохранять в файл имя шрифта, размер,
стиль, цвет. Т.е. примерно так:

WriteLn(f,Font.name);
WriteLn(f,Form1.FontStylesToStr(font.style));
WriteLn(f,Font.size);
WriteLn(f,ColorTORgb(Font.color));

Ну и загружать соотв.
Ответ 6:
Я записывал следующим образом

...
type
TFontDan = record
FontName:string[50];
FontColor:TColor;
FontSize:integer;
FontStyl:TFontStyles;
end;
...
var
WorkDan:TDan
...
uses
inifiles;
//////////////////////////////////////////////////////////
function TfrmMain.StyleFontToStr(Styl:TFontStyles):string;
var
temp:string[4];
tempStyl:TFontStyles;
begin
temp:='0000';
tempStyl:=Styl;

if tempStyl-[fsItalic,fsUnderline,fsStrikeOut] =[fsBold]
then temp[1]:='1';
if tempStyl-[fsBold,fsUnderline,fsStrikeOut] = [fsItalic]
then temp[2]:='1';
if tempStyl-[fsBold,fsItalic,fsStrikeOut] = [fsUnderline]
then temp[3]:='1';
if tempStyl-[fsBold,fsItalic,fsUnderline]=[fsStrikeOut]
then temp[4]:='1';

StyleFontToStr:=temp;
end;
//////////////////////////////////////////////////////////
function TfrmMain.StrToStyleFont(str:string):TFontStyles;
var
temp:TFontStyles;
begin
temp:=[];
if str[1]='1' then temp:= temp+[fsBold];
if str[2]='1' then temp:= temp+[fsItalic];
if str[3]='1' then temp:= temp+[fsUnderline];
if str[4]='1' then temp:= temp+[fsStrikeOut];
StrToStyleFont:= temp;
end;
//////////////////////////////////////////////////////////
procedure TfrmMain.SaveOption;
var
ini:TIniFile;
begin
//пишим
Ini := TIniFile.Create(frmMain.OptDir);
Ini.WriteString ('FontInfo','Name',WorkDan.FontName );
Ini.WriteString('FontInfo','Style',StyleFontToStr(WorkDan.FontStyl));
Ini.WriteInteger('FontInfo','Color',WorkDan.FontColor );
Ini.WriteInteger('FontInfo','ColorFon',WorkDan.ColorFon );
Ini.WriteInteger('FontInfo','Size',WorkDan.FontSize );
Ini.Free;
end;

procedure TfrmMain.LoadOption;
var
ini:TIniFile;
begin
// грузим
Ini := TIniFile.Create(frmMain.OptDir);
WorkDan.FontName := Ini.ReadString ('FontInfo','Name','Fixedsys');
WorkDan.FontStyl := StrToStyleFont
(Ini.ReadString('FontInfo','Style',StyleFontToStr(frmMain.Font.Style)));
WorkDan.FontColor:= Ini.ReadInteger('FontInfo','Color',frmMain.Font.Color);
WorkDan.ColorFon := Ini.ReadInteger('FontInfo','ColorFon',clWindow);
WorkDan.FontSize := Ini.ReadInteger('FontInfo','Size',frmMain.Font.Size);
Ini.Free;
end;

Наверное грамозко, но зато работает :)
Ответ 7:
Установи RXLib там есть компонента TFormStorage она решит эту проблему без написания кода
Ответ 8:
Можно сделать это примерно так (если требуется записать в файл параметры
одного шрифта):
.....................................................
type
Fnt = record
Size : integer;
Color : integer;
Style : TFontStyles;
end;

// Процедура записи шрифта
procedure SaveTextFont(FileName : TFileName; SaveFont : TFont);
var f : File;
TextFont : Fnt;
i : integer;
begin
TextFont.Color := SaveFont.Color;
TextFont.Size := SaveFont.Size;
TextFont.Style := SaveFont.Style;

AssignFile(f, FileName);
ReWrite(f, 1);
BlockWrite(f, TextFont, SizeOf(TextFont));

// Далее записываем в конец файла строку с именем шрифта, соответствующую
его длине
FOR i := 1 TO Length(SaveFont.Name) DO
BlockWrite(f, SaveFont.Name[i], 1);

CloseFile(f);
end;

// Процедура загрузки шрифта
procedure LoadTextFont(Filename : TFileName; var LoadFont : TFont);
var f : File;
TextFont : Fnt;
c : Char;
s : String;
begin
AssignFile(f, FileName);
ReSet(f, 1);
BlockRead(f, TextFont, SizeOf(TextFont));

// Считываем имя шрифта до конца файла
WHILE NOT EOF(f) DO Begin
BlockRead(f, c, 1);
s := s + c;
End;

CloseFile(f);

LoadFont.Color := TextFont.Color;
LoadFont.Size := TextFont.Size;
LoadFont.Style := TextFont.Style;
LoadFont.Name := s;
end;
......................................................................
Если делать запись нескольких шрифтов в файл, придется имя шрифта записывать
несколько иначе. Типа type Fnt.Name, где Name : String - объявить нельзя,
т. к. не определена длина строки. Если объявить его как String[x] или
ShortString,
то в файл будет записана все строка из x или 255 соответственно символов,
что
повлияет на размер файла. Здесь придется добавить поле NameLen в тип Fnt:
NameLen : Byte;
После чего этому полю присваивается значение длины названия шрифта.
Чтение из файла будет тогда такое:
...........................
// Считываем имя шрифта до значения NameLen
FOR i := 1 TO LoadFont.NameLen DO Begin
BlockRead(f, c, 1);
s := s + c;
End;
............................
Плюс ко всему, переменную f : File придется объявить не как локальную, т. е.
обратиться к файлу вне процедуры SaveTextFile и LoadTextFont.
Ответ 9:
Я могу предложить следующий стабильно работающий пример, годящийся для запоминания параметров шрифта любых
компонентов :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, IniFiles;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
FontDialog1: TFontDialog;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
MyIni: TIniFile;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
{Установка параметров шрифта}
FontDialog1.Options:=FontDialog1.Options+[fdApplyButton];
if FontDialog1.Execute then
Memo1.Font.Assign(FontDialog1.Font);
end;

procedure TForm1.Button2Click(Sender: TObject);
var tmpfont: TFont;
begin
{Сохранение параметров шрифта из конфигурационном файле}
MyIni:=TIniFile.Create('Settings.cfg');
MyIni.WriteInteger('SETUP','CHARSET',Memo1.Font.Charset);
MyIni.WriteInteger('SETUP','COLOR',Memo1.Font.Color);
MyIni.WriteInteger('SETUP','Height',Memo1.Font.Height);
MyIni.WriteString('SETUP','COLOR',Memo1.Font.Name);
MyIni.WriteInteger('SETUP','SIZE',Memo1.Font.Size);
tmpfont:=Memo1.Font;
if Memo1.Font.style="tmpfont.Style+[fsBold]" then
MyIni.WriteBool('SETUP','BOLD',True) else
MyIni.WriteBool('SETUP','BOLD',False);
{...}
{Аналогично для остальных параметров стиля шрифта}
{...}
MyIni.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
{Загрузка параметров шрифта из конфигурационного файла}
MyIni:=TIniFile.Create('Settings.cfg');
Memo1.Font.Charset:=MyIni.ReadInteger('SETUP','CHARSET',0);
Memo1.Font.Color:=MyIni.ReadInteger('SETUP','COLOR',0);
Memo1.Font.Height:=MyIni.ReadInteger('SETUP','Height',8);
Memo1.Font.Name:=MyIni.ReadString('SETUP','COLOR','');
Memo1.Font.Size:=MyIni.ReadInteger('SETUP','SIZE',8);
if MyIni.ReadBool('SETUP','BOLD',True)=True then
Memo1.Font.Style:=Memo1.Font.Style+[fsBold] else
Memo1.Font.Style:=Memo1.Font.Style-[fsBold];
{...}
{Аналогично для остальных параметров стиля шрифта}
{...}
MyIni.Free;
end;

end.
Ответ 10:
у меня такая процедура пишит ini файл как его назвать без разници в
uses надо добавить IniFiles

procedure TForm1.Save(Sender: TObject);
var
fil:TIniFile;
begin
fil:= TIniFile.Create('clock.ini');
with fil do
begin
WriteInteger('Options', 'posx', Self.Top); // позиция окна
WriteInteger('Options', 'posy', Self.Left); //
WriteInteger('Options', 'color', Label1.Color); // цвет
WriteString('Options', 'font_name', Label1.font.Name); // шрифт
WriteInteger('Options', 'font_char', Label1.font.Charset); //
WriteInteger('Options', 'font_color', Label1.font.Color); //
WriteInteger('Options', 'font_size', Label1.font.Size); //
Free;
end;
end;
Ответ 11:
попробуй изменить

var f :file; ------> var f: file of TFont;
textfont :tfont;
begin
textfont:=StaticText2.font;
assignfile(f,'emulator.cfg');
rewrite(f);

write(f,textfont);
closefile(f);
end;

Вопрос 63:

От: Roman Kulish

Столкнулся с одной проблемой и вот такой вопросец: компилятор в
процессе компиляции программы выдает "Internal error $xxxxx", но
компилированная программа очень даже жизнеспособна. Но в 1 случае из
5-ти, по выходе из программы выдается "ошибка <нет данных> в модуле
<нет данных>" и после нее "Run-time error 216".
При чем компилировал программу на 6-ти разных тачках в Дельфях 4 и
5, кругом такая проблема. Четыре человека "просеивали" код по строчкам
и ничего не нашли. Программа состоит на 2/3 из VCL вызовов и на 1/3
написана на Вынь Апи :) Ни ассемблеровских вставок ни указаний
компилятору нет.
Кто-нибудь может подать идею с чем все это связано?


Ответить.

Ответ 1:
У меня была похожая проблемма (в смысле, Internal Error). Пришлось переписать код, на котором она ругалась. Точнее
всю процедуру. Смысл остался, но алгоритм изменился. А так, Borland предлагает обращаться к ним с подобными
ошибками.
Станислав.
Ответ 2:
Попробуй отключить оптимизацию в настройках компилера... иногда
помогает
Ответ 3:
Я сталкнулся с такой же проблемой, когда заменил unit компоненты на другой
(разгое время создания).
При компиляции уже работающей программы Делфи стала выдавать сообщение об
ошибке "Internal error $xxx".
После перекомпеляции пакета, содержащего данную компоненту, ошибка пропала.
По этому, рекомендую, проанализировать код программы на использование
вставок из других программ.
Возможно в них используются компоненты, не установленные на Вашем компьютере
или их версии не совпадают.

Что касается сообщения об ошибке "Run time error 216", то, на мой взгляд,
это не связано с предыдущей ошибкой.
Я такую ошибку получал, когда при закрытии программы складывались такие
условия, что не выключался Timer.
Рекомендую проанализировать код программы на предмет выключения программно
включаемых компонент и
уничтожения временно создаваемых объектов, типа TLIST и т.п.

С уважением,
Сергей.
Ответ 4:
Internal Error в 99% случаев встречается при
неправильных выходах из циклов, процедур и т.п., то
есть, когда возвращаются из стека не ожидаемые
данные... (больше абстрактно ничем не могу помочь)
Ответ 5:
Вот что по этому поводу говорит Borland:
You should never get this error message - it means there is a programming error in the compiler.If you do, please call Inprise
Developer Support and let us know the ErrorCode (e.g. "C1196") that appears in the error message. This will give us a rough
indication what went wrong. It is even more helpful if you can give us an example program that produces this message.
То есть: это ошибка компилятора. Если вдруг такое случится, то свяжитесь с Inprise Developer Support и сообщите код
ошибки, чтобы они могли понять, что у них неправильно. А также будет полезно, если вы сможете дать им пример
программы....


Вопрос 64:

От: Алексей

Здравствуйте!
Напишите пожалуйста, как будет выглядеть текст программы, окно которой имеет
просто одну кнопку, при нажатии на которую запустится программа C:\1\1.exe.
И будет ли это работать с относительным путём?
Я в этом полный ноль.


Ответить.

Ответ 1:
Окно размером в кнопку сделаешь сам - ведь это не трудно. Не забудь
обработать событие OnClick и поставить на него Close.

С относительным путем проще.
MyPath:=ExtractFilePath(Application.ExeName);
Далее переменную MyPath подставляешь куда нуобходимо.
Ответ 2:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ShellApi;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject);
begin
width:= button1.Width;
height:= button1.Height;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
shellexecute(0, nil, '1.exe', nil, 'c:\1', sw_restore);
end;
end.

В инспекторе объектов необходимо указать для Form1:
BorderStyle:= None;
Position:= poScreenCenter;

для Button1
Left:= 0;
Top:= 0;

Тогда при запуске программы в центре экрана будет отображаться одна
кнопка, нажатие на которую приведет к запуску другой программы.


Вопрос 65:

От: ION

Обычно компилированный ЕХЕ файл занимает около 400, а как сделать его в
маленький размер около 50?


Ответить.

Ответ 1:
Можно, но тогда вместе с *.exe Вам придется распространять и
библиотеки. Для этого поставьте в опциях проекта галочку
на Packages\Build with runtime packages.
Ответ 2:
Можно еще задействовать компрессоры:
NeoLite (ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip),
Petite (http://www.icl.ndirect.co.uk/petite),
Shrinker (http://www.blinkinc.com)
Ответ 3:
Есть несколько путей:
1) Компиллировать пакеты отдельно, но тогда их
прийдется распространять с программой, выгоды не будет
2) Писать только консольные приложения, тогда никаких
форм, кнопок и т.п. не будет
3) Писать только на WinAPI - оччччччень трудоемкий
процесс - только чтобы показать форму вы напишете
строк 100 кода, и так для каждото компонента, и
обработчик событий свой писать прийдется и т.п.,
собственно что бы избавить Вас от этой мороки и был
придуман Дельфи
4) Есть несколько сторонних VCL библиотек, меньшего
размера, посмотрите на www.torry.net, но прийдется
отказаться почти от всех привычных библиотек
5) компрессировать результирующий файл - у меня есть
абсолютно беспланый упаковщик, компрессия сопоставима
с zip/rar, для конечного пользователя совсем
прозрачно. Напишите мне - я вышлю если надо, или
положу на свой сайт.
Ответ 4:
1) Сжать его паковщиком, например NeoLite-ом (правда из 400 кил 50 не получится... у меня из
357к осталось 186к... Есть и другие упаковщики, но НеоЛит сжимает сильнее.)
2) Использовать файловые потоки для сбрасывания всех визуальных объектов формы в файл. (Экзешник
получается меньше, но появляется дополнительный файл и в результате общий размер не изменяется...)
Ответ 5:


Вопрос 66:

От: Загорский Антон

А как записать (читать) в файл переменную, допустим, строкового типа, можно
ли это сделать, как в Паскале?



Ответить.

Ответ 1:
.....
var f : TextFile;

begin
AssignFile(f,'c:\qqq.txt');
Rewrite(f);
Writeln(f,'qqqqq');
CloseFile(f);

end;

Это как в паскале.
Можно еще так.
.....
var s : TStringList;
begin
s := TStringList.Create;
s.Text := 'qqqqqqq';
s.SaveToFile('c:\qqq.txt');
s.Free;
end;
Ответ 2:
Если строка короткая, то все будет так же как в
Паскале, если длинная, то можно обмануть Дельфи, чтоб
писал строку вместо указателя:

writeln(f,pointer(MyLongString)^)

Есть еще несколько способов, например:

with TStringlist.create do
try
text:=MyLongStringName;
SaveToFile(MyFileName);
finally
free;
end;



Вопрос 67:

От: Gorojankin Dmitri

Добрый день.
Тут опять-же масса вариантов, если это интернет - поиск страничек,
то скачивать их можно через HTTP.
Если своя сеть, с заранее известными адресами, и поиск надо проводить
прямо в документах на машине, то тут просто - через зашаренные
ресурсы или посложнее - через сокеты, тогда нужна-таки серверная
часть.
Я думаю, что это не своя сеть, а сеть-WWW. Для конкретизации задачи
такой пример. Есть адрес какого либо словаря, по этому адресу имеется
N каких-то терминов и по каждому термину на отдельной страничке имеется
текст. Нужно програмно, начиная с главной странички, зайти на каждую
страничку и скачать все тексты.

Ответить.

Ответ 1:


Вопрос 68:

От: Хазанов

Здравствуйте!
Q: Как передать параметр в уже запущенную программу методом Dragamp&Drop?
Например, как сделать, чтобы после перетаскивания файла из
Проводника на форму последняя поменяла свой Caption на имя файла?
Спасибо - Михаил.


Ответить.

Ответ 1:
Вот это я как-то нашёл на одном из русских FAQов в Internete. Проверено -
работает.
Этот модуль отображает в ListBoxе имена отбуксированых файлов из проводника
на форму

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, shellapi;

type
TForm1 = class(TForm)
Panel1: TPanel;
ListBox1: TListBox;
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

const SC_DragMove=$F012;
begin
ReleaseCapture;
Panel1.Perform(WM_SYSCommand, SC_DragMove, 0);
end;

(*procedure TForm1.WMDropFiles(var Msg : TMessage);
var
i, n : word;
Size : Word;
FName : String;
HDrop : Word;

begin
{1. Получить handle того, что бросили на форму}
HDrop := Msg.WParam;
{2. Сколько файлов брошено?}
n := DragQueryFile(HDrop, $FFFF, NIL, 0);
ShowMessage(IntToStr(HDROP));
{3. Цикл чтения имен файлов}
for i := 0 to (n - 1) do begin

{4. Получить размер имени файла}
Size := DragQueryFile(HDrop, i, NIL, 0);

{5. Размер строки<255 символов?}
if Size < 255 then begin
FName[1] := Chr(Size);
{6. Получить имя файла}
DragQueryFile(HDrop, i, @FName[1], Size + 1);
{-- Далее делаете все, что хотите с этим файлом. --}

// Form1.ListBox1.Items.Add(FName);
end;

end;
{7. Возвращаем ноль.}
Msg.Result := 0;
{8. Вызов унаследованного обработчика сообщения}
inherited;
end;*)
procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES);
var
NumFiles : longint;
i : longint;
buffer : array[0..255] of char;
begin
{Сколько файдов прибуксовано}
NumFiles := DragQueryFile(Message.Drop,$FFFFFFFF,nil,0);
{Принимаем брошенные файлы}
for i := 0 to (NumFiles - 1) do begin
DragQueryFile(Message.Drop,i,@buffer,sizeof(buffer));
Form1.ListBox1.Items.Add(buffer);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Form1.Handle, True);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DragAcceptFiles(Handle, false);

end;

end.
Ответ 2:
Для обработки событий Dragamp&Drop нужно определить два обработчика событий для формы: OnDragOver и OnDragDrop.
Первое событие возникает при протаскивании над формой какого-либо объекта. В параметрах события указывается, кому
принадлежит перетаскиваемый объект, т.е. его Источник. При возможности и желании принять этот объект
параметру-переменной Accept присваивается значение True.

Второе событие возникает при опускании перетаскиваемого объекта на форму. В нем нужно выполнить все действия по
обработке "брошенного" объекта. Дополнительную информацию о нем можно получить из параметров события.
Более подробно можно посмотреть в хелпе, у меня сейчас под рукой нет исходников с примерами.
Ответ 3:
--начало--
Uses ShellApi;
...
private
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
...


procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;


procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
CFileName: array[0..MAX_PATH] of Char;
begin
try
if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH)>0 then
begin
Form1.Caption:=CFileName;// Вот тут и оно!
Msg.Result := 0;
end;
finally
DragFinish(Msg.Drop);
end;
end;
--конец--

С уважением,
Semen

Вопрос 69:

От: Evgenii

Есть база данных написанная в InterBase. Связка
TTable-DataSource-DBGrid работает (можно редактировать таблицы,
удалять/добавлять записи), но при обращении к хранимым процедурам
(к примеру на удаление/модификацию записи) в DBGrid ничего не
меняется. Как можно исправить эту ситуацию?
Но связка TQuery-DataSource-DBGrid никак не работает. Через
компоненту DBGrid не добавить/удалить/модифицировать записи, и
при обращении к хранимой процедуре на, к примеру, удаление
записи, ничего нового не отображается в DBGrid.

Надеюсь на ответ. Спасибо.


Ответить.

Ответ 1:
Это работает, нужно только обновить данные

Query1.close;
Query1.open;

если при этом есть желание оставить текущую запись активной
(после переоткрытия текущей становится первая запись)
можно пользоваться
query1.locate(...)
Ответ 2:
Очень не советую использовать TTable. Это сводит к "0" все преимущества Client-Server.
Попробуйте набор FIBplus. Там в TpFIBDataSet есть properties SelectSQL,InsertSQL,DeleteSQl,UpdateSQL. Их
заполняете и работаете как хочется. К тому же не нужна BDE!
Наборчик можно взять на http://www.second-dream.ru/
Сам работаю с ним уже год - No problem
Владимир
Ответ 3:
>Есть база данных написанная в InterBase. Связка
>TTable-DataSource-DBGrid работает (можно редактировать таблицы,
>удалять/добавлять записи), но при обращении к хранимым процедурам
>(к примеру на удаление/модификацию записи) в DBGrid ничего не
>меняется. Как можно исправить эту ситуацию?

После выполнения хранимой процедуры сделай Table1.Refresh;

>Но связка TQuery-DataSource-DBGrid никак не работает. Через
>компоненту DBGrid не добавить/удалить/модифицировать записи, и
>при обращении к хранимой процедуре на, к примеру, удаление
>записи, ничего нового не отображается в DBGrid.
Добавлять/ удалять/модифицировать записи в DBGrid при связке Query-DataSource-DBGrid можно будет
только при условии, если свойство RequestLive в TQuery будет иметь значение True, и то только при
условии если запрос осуществляется на одной таблице. А что бы отражались изменения после
выполнения хранимой процедуры необходимо закрыть TQuery (TQuery.Close) и открыть снова
(TQuery.Open).

По-моему так.
Ответ 4:
Попробуй применить метод requery к TQuery или refresh к DBGid
Ответ 5:
Ну, во-первых, нужно сделать CommitRetaining для компонента DataBase.
А во-вторых, перечитать данные из таблицы...
Ответ 6:
При работе с серверами БД мы имеем дело, по сути, не с таблицами, а с курсорами, которые часто бывают статичными. В
случае TTable, скорее всего, можно получить изменения с сервера с помощью механизма нотификации. С TQuery сложнее -
он изначально статичен, поэтому в него нельзя внести изменения (точнее, это сделать не так просто, как для TTable -
запрос должен быть "живым", т.е. RequestLive:=True, или для него описан TUpdateSQL), а для получения изменений с
сервера необходимо повторно выполнять запрос.
Ответ 7:
Обновите данные
В случае с TTable после выполнения хранимой процедуры
выполните
Table.Close;
Table.Open;

то же и с TQuery.
Ответ 8:
При работе с TQuery, в некоторых случаях возможна установка
свойства RequestLive в true и работа с обновляемым набором данных.
При использовании соединений или просто при выборке из нескольких
таблиц, набор данных становится необновляемым.
Для того, чтобы синхронизировать работу компонентов TQuery,
и TDBGrid, необходимо использовать TUpdateSQL. В данном случае,
для компонента TUpdateSQL указываются sql-предложения для
обновления, вставки и удаления строк; а для компонента Query
устанавливается свойство UpdateObject (его значение - имя компонента
типа TUpdateSQL). Если для удаления строк используется хранимая
процедура, то ее вызов может быть заключен в sql-предложении
свойства DeleteSQL компонента TUpdateSQL.
Вообще-то, такой подход может быть применен и для компонента
TTable, хотя для доступа к Interbase предпочтительнее (читай корректнее)
обращаться с помощью запросов.
Ответ 9:
Это естественно, так как в данном случае Ваш набор данных, полученный
с помощью запроса, является нередактируемым. То есть, Вы можете только
видеть результат выборки. Лечится это путём добавления в эту
"компанию" компонента TUpdateSQL и настройки его и TQuery
соответствующим образом.
Для TQuery нужно установить свойствa CachedUpdates в True,
UpdateObject - Ваш компонент TUpdateSQL. При выборе компонента
TUpdateSQL обратите внимание на Инспектор объектов. Там будет
отображено 3 основных свойства, наиболее важных для Вашей задачи:
DeleteSQL, InsertSQL, ModifySQL. Все они имеют тип TStrings. Вызвав
редактор свойств каждого из них будут сгенерированы соответствующие
запросы.


Вопрос 70:

От: Илья

Здравствуйте

Имеется (скорее всего чисто логичекая) проблема с компонентами IB , а
конкретнее с IBDataBase (ох как не хочется выглядеть ламером :)) :
Как вы наверное знаете существует одно серьёзное отличие в параметрах
IBDataBase и просто DataBase - это DataBaseName , т.е. надо создать
файл с параметрами БД , а в хелпах от етого вопроса очень тактично
увиливают типа : "Укажите имя файла БД" :(
Что делал я (по аналогии с TTable):
- всякие там Params.add .......
- DataBaseName:='какой-нибудь.файл'
- CreateDataBase
Реакция при выполнении:
Что-то типа - "Невозможная или несуществующая БД" - Причем ошибка
именно на метод "Создать"
Моя реакция:
#8-0

Вот сижу и думаю , что либо у IBDataBase существуют некие обязательные
параметры, которых я не знаю и потому ессено их не указал, либо ето
просто какие-то бешеные глюки (уж у меня или Дэлфы - не знаю :))

Заранее благодарен за ответ!

Да, чуть не забыл - Ну хоть кто-нибудь может мне вразумительно
ответить почему например Paradox драйвер БД пашет идеально, а ни один
из ODBC-шных не работает совсем!!!!!!


Ответить.

Ответ 1:
Как я понимаю, у тебя имеется база данных под интербейсом и ты хочешь создать в ней таблицу?
Используй SQL и все твои проблемы отпадут.
Немного RTFM по поводу комманды
create table и все будет впорядке! .)
Ответ 2:
Да, действительно, надо сначала создать базу данных, а уже потом начинать с ней работать... Тогда в окошке выбора
базы компонента IBDataBase нужно будет указать полный путь к файлу *.gdb на сервере...
Ответ 3:
Надо заходить сначала под зарезервированным логином и паролем, сейчас точно не скажу, надо сначала гнигу
забрать, после того как залогинишся появляется возможность создавать базу данных по принципу: Создать Поле
таго-то типа и т.д.
Ответ 4:
Я не в состоянии указать, почему при создании БД у Вас выдавалась такая ошибка,
однако могу привести пример кода, действительно создающего БД:

procedure TForm1.Button1Click(Sender: TObject);
begin
//имя файла БД на диске
IBDatabase1.DatabaseName := 'c:\databases\test.gdb';
//продолжение команды create database для Interbase
IBDatabase1.Params.Add('user "SYSDBA" password "masterkey" page_size 4096');
//диалект:
// 1-формат БД совместим с версией IB5
// 3-формат IB6
IBDatabase1.SQLDialect := 1;

IBDatabase1.CreateDatabase;
end;
По вопросу о ODBC драйверах, приведите, пожалуйста, пример Вашего кода.
В противном случае, боюсь, я не могу ответить.


Вопрос 71:

От: Фёдоров А. Н.

Привет господа хорошие делфисты! :)

Кто нибудь знает где найти инфу по созданию собственного
драйвера для коммуникационного порта (C\C++ или Delphi - всё равно)
на руском языке желательно конечно!



Ответить.

Ответ 1:
Посмотри на http://slydiman.hotmail.ru/rus/comm/index.htm
Serial (COM) port control component for C++ Builder 5 (full source code)
Позволяет осуществить доступ к COM порту для взаимодействия с различными
устройствами
или модемом. Разобраться, как работает компонент можно посмотрев
исходники COM
Watcher - что-то типа терминалки.

Вопрос 72:

От: oo

Hello ,

подскажите как работать с модемом под win 2000
написать простейший диалер я с хелпом так и не разобрался



Ответить.

Ответ 1:
У меня есть такой пример. Может поможет разобраться.
Станислав.


Как <http://delphi.mastak.ru/cgi-bin/faq.pl?look=1amp&id=1-959901315>
опеределить состояние модема под Win32?
_____

См. пример
Пример:


procedure TForm1.Button1Click(Sender: TObject);
var
CommPort : string;
hCommFile : THandle;
ModemStat : DWord;
begin
CommPort := 'COM2';

{Open the comm port}
hCommFile := CreateFile(PChar(CommPort),
GENERIC_READ,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if hCommFile = INVALID_HANDLE_VALUE then
begin
ShowMessage('Unable to open '+ CommPort);
exit;
end;

{Get the Modem Status}
if GetCommModemStatus(hCommFile, ModemStat) <> false then begin
if ModemStat and MS_CTS_ON <> 0 then
ShowMessage('The CTS (clear-to-send) is on.');
if ModemStat and MS_DSR_O!

N <> 0 then
ShowMessage('The DSR (data-set-ready) is on.');
if ModemStat and MS_RING_ON <> 0then
ShowMessage('The ring indicator is on.');
if ModemStat and MS_RLSD_ON <> 0 then
ShowMessage('The RLSD (receive-line-signal-detect) is
on.');
end;

{Close the comm port}
CloseHandle(hCommFile);
end;


Источник: Дельфи. Вокруг да <http://www.vlata.com/delphi/> около.
Ответ 2:
А на кой, извиняюсь, чорт тебе понадобился драйвер для модема? .)
На самом деле как такового драйвера для модемов под виндой не существует.
Есть только *.inf файлы с АТ коммандами для конфигурирования оного девайса.
(всякие приблуды для работы с войсовыми функциями модемов я в расчет не беру)

Вот. Если же тебе нужно работать с модемом из под дельфей (ну там написать какой нибуть
терминал, звонилку, передачу факсов организовать), то используй AsyncPro.
Ответ 3:
Используйте компонент Async Professional.
Его можно найти в комплекте Turbo Power
Все для работы с модемом (+факс) и куча различных примеров.

С уважением, Semen


Вопрос 73:

От: Grachev

Здравствуйте.
Как написать в Delphi процедуру, которая бы выполняла задержку времени.
Аналог процедуры Delay в Турбо Паскале.


Ответить.

Ответ 1:
Писать ничего не надо - есть функция WinAPI:
Sleep(s); // s - это миллисекунды.


Вопрос 74:

От: ruslan_as@papir.kiev.ua

Извините за непонятный интерфейс вопроса.
Дело в том, что мне нужно было сделать меню запуска программ.
Меню-программа будет находится в корневом каталоге на CD.
В этой программе мне нужно указать: запустить программу,
которая находиться в каталоге YYY на этом диске.
Но указать путь D:\YYY\proga.exe я не могу, так как у меня CD это
диск D:\ а у моего друга это диск F:\ и т.д., а может кто захочет
переписать мою программу себе на комп.
Появилась идея: может есть функция, которая мне укажет и переведет
в строковую переменную путь моей программки-меню. Т.е. если она
находится на диске F:\, то она она в строковую переменную
загонит "F:\", а если моя программа находиться на C:\TRT\ то
напишет "C:\TRT\".


Ответить.

Ответ 1:

Может вот так :

....
var
CurrntDir : String;
.....
procedure TTrmnForm.FormCreate(Sender: TObject);
begin

GetDir(0,CurrntDir); // Получаем полный путь к *.exe

end;
Ответ 2:
можно так:
sPath := ExtractFilePath(Application.ExeName); //Получаем путь к exe


2. Очередные вопросы.
----------------------


Вопрос 171:

От: Гавриленко Степан

Привет.

Вопрос, который адрессован как лично вам, так и можно написать о нем в
рассылке.

Есть задача.. Нужно заперетить запись определнных фалов на винт
вообще. Т.е написать например прогу которая недвала бы записывать на
винт файлы с расширением tmp
не то чтобы потом стерала, а именно что недавала.. КАк это дело
осуществить.

В часности дело в том что наш любимый виндовс Линолиум посмтоянно
создает папку Restore и туда пихает мегов во 500 в лучшем случае, а
стереть ее можно только из-под доса..



--
C уважением Гавриленко Степан
Nick : FSP
ICQ : 78182330
Home Page : ****
E-mail : fsp@au.ru




Ответить.

Ответ 1:


Вопрос 172:

От: Ekaterina Yakovleva

Моя программа выполняет очень большие запросы с помощью TQuery. Пока
выполняется Query.Open (а это может быть несколько минут) программа
выглядит "зависшей": не перерисовывается форма, не реагирует на нажатия
и т.д. Как этого избежать? Желательно, чтобы во время выполнения
запроса программа продолжала нормально существовать.


Ответить.

Ответ 1:


Вопрос 173:

От: YDB

Вопрос:
можно ли в Делфи как-то работать с видеопамятью?
Вообще, можно ли в Windows вывести произвольную
картинку прямо на монитор (минуя создание окна)?
Если можно, то как?


Ответить.

Ответ 1:


Вопрос 174:

От: YDB

Вопрос:
Как перехватывать или хотя бы обрабатывать
глобальные события Windows
(Клавиатура, мышь, запуск файла)
если у меня в проекте нет визуальных компонент и формы?

Дмитрий


Ответить.

Ответ 1:


Вопрос 175:

От: Александр Мордовский

Добрый день, Дмитрий Владимирович,

Большое спасибо вам за полезные советы.

Подскажите пожалуйста решение следующей проблемы:

есть форма для заполнения документа, который храниться в двух таблицах
-таблица заголовков документов
-таблица строк документов
для заполнения строк документа используется DBGrid,
каждая введенная строка сохраняется автоматически при переходе на новую

Как можно сделать так, чтобы сначала вводились все строки документа, а
затем все они сохранялись одной транзакцией?

Заранее спасибо вам за ответ
--
Best regards,
Александр mailto:sanya@creditural.ru




Ответить.

Ответ 1:


Вопрос 176:

От: Egorov


чПРТПУ:
Здравствуйте!
Если можете ответьте пожалуйста на такой вопрос: Как программно
прочитать (и изменить!) настройки Панели Управления, например, как
узнать разделитель целой и дробной части числа или даты?
Заранее благодарю,

Саша.


Ответить.

Ответ 1:


Вопрос 177:

От: www.irop.de

Огромное спасибки за помощь всем великим программистам!
А дату отнять от даты: Edit1.Text :=
IntToStr(Round(DateTimePicker1.Date - DateTimePicker2.Date))
Так глядишь и программирование начнёшь понимать...
А теперь у меня очень серьёзный вопрос. Думаю многим может пригодиться:
У меня база данных в Excel97 и я не хочу переписывать. Мало места
занимает, наглядно
и сохранять легко на дискете. Везде открыть можно...
Но создал Форму для поиска необходимого человека, а увязать не могу.
Т.е. мне надо набрать н-р Ульяновск, а форма покажет 1-го человека из
таблицы со всеми данными, если это не он, нажму "искать следущего" и
т.д.
Хочу точно знать, что установить в свойствах для TTable, DataSource и
т.д.
И даже ссылка на таблицу должна быть на форме, вдруг место поменяет
(н-р: на дискету).

Best regards,
Igor
==================================
www.irop.de <http://www.irop.de> Baby: boy or girl? (en, de, ru)



Ответить.

Ответ 1:


Вопрос 178:

От: Westa

А подскажите, как записи из поля таблицы преобразовать в массив?


Ответить.

Ответ 1:


Вопрос 179:

От: Dmitry


чПРТПУ:

Уважаемый Д Тарасов !

У меня следующая проблема. Запускается DOS-задача. Из под нее запускается
Delphi-задача. Необходимо вернуть фокус ввода обратно в DOS-задачу.
API функции типа FindWindows, BringWindowToTop(HWND);
выполняются но активным остается окно из которого запускается Delphi-задача.
Для упрощения я попытался активизировать хотя бы окно WORD но и с ним у меня
ничего не получается:
my_HWND :=FindWindow(nil,'Microsoft Word - Документ1');
windows.SetFocus(my_HWND);
Под отладчиком дескриптор WORD виден но активным WORD не становиться.

С уважением, Дмитрий.



_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com



Ответить.

Ответ 1:



3. Ищу подельника.
------------------
Sam Savinov:
Ищу желающих принять участие в создании новой версии
криптографического пакета FET. С последней версией которого
можно ознакомиться по адресу: www.myportal.ru/ss
SAM / sam@myportal.ru

Astanin Dmitry:
Ищу желающих помочь мне в создании программы, обеспечивающей
одновременный доступ нескольких пользователей с
разных компьютеров в лок. сети (в этом я вообще чайник) и аудит
событий с сохранением результатов в защищенном
файле .. Дима kinch-ch@mail.ru

Лобастов Николай:
Здравстуйте, господа программисты.

У меня в голове куча идей, только не знаю куда с ними сунуться.
Два дня назад пришел к одному выводу и хочу с вами
поделиться. Может кто уже так делает. Может кто дельный совет даст.

Я работаю в банке в отделе разработки и столкнулся с тем, что мы часто
повторяемся в написании каких-то вещей.

Что такое хоз. деятельность любой организации? Это производство мат.
ценностей или услуг и ведение учета и отчетности. К чему сводится
отчетность? К документообороту. Что такое документ? Это объект с набором
свойств и методов. Никому не приходилось создавать компоненты TDocument,
TPlategka, TPKO, TRKO? Можно описать такие свойства как база данных, таблица,
номер, дата, название, методы такие как создать документ, провести документ,
распечатать документ и все это разместить на палитре компонент. И при
разработке чего-то еще нового в организации или в какой-то
фирме для организации просто кидаешь их на форму или в датамодуль
и описываешь реакцию на события.

Такая библиотека сильно облегчит автоматизацию предприятия, а разработчикам
поможет заработать кучу денег. Ведь это же златая кладезь.

Жду ответов и предложений. - Lobastov@kedr.kts.ru




Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.

Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.

За сим прощаюсь - скорых Вам и качественных программ.

Автор рассылки - Дмитрий.
ICQ - 89533941.

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное