Masters of Delphi
 Сайт клуба любителей Delphi 
· FAQ · Статьи · Конференции · Ссылки · Новости мира компонент ·

Часто задаваемые Вопросы.. F.A.Q.

Дайджест от 25.11.2000

    Если Вы не нашли ответ на свой вопрос в этом дайджесте, то попробуйте найти его в основной базе.
    Поиск ведется так же и в "Круглом столе" славного "Королевства дельфи".
    И в разделе "Взаимопощь" на www.infoart.ru
Ключевые слова
Напоминаем, Вы можете получать лучшие вопросы на свой email !!! Достаточно подписаться на нашу почтовую конференцию.
 
Компоненты


Как уменьшить размер исполняемого файла программы?
Писать на WinAPI без использования VCL. Это пригодно для и без того крохотных программ.

Воспользоваться пакетами (packages) из Delphi 3. Эффект появится, когда исполняемых файлов больше одного.

Воспользоваться компрессорами исполняемых файлов, например: Shrinker http://www.blinkinc.com, WWPack32 http://kolos.uni.lodz.pl/warezak, NeoLite ftp://ftp.zdnet.com/pub/private/sWlIB/utilities/other_utilities/neolitee.zip, Petite, http://www.icl.ndirect.co.uk/petite/.

-- Коментарий от Щербинина Евгения --
Про Aspack!
Автор Alexy Solodnikov
shareware до версии 1.7 нет ограничения по времени.
адрес http://www.entechtaiwan.com/aspack.htm
Сжимает лучше чем Shrinker (до 50%)
Ошибок в нем похоже нет. (Пробовал)
Проги грузятся куда быстрее.
Правда в Инете была дискуссия о том, что все это от лукаваого и не нужно. Требуется память для распаковки.
При укладке в Install Shield экономится уже куда меньше места (~10%), похоже Shield тоже знает о том где надавить на RCDATA.
НаверхПрислать свои комментарии

Как заставить появляться хинт, когда я захочy ?



{Появление}
IF h<>nil H.ReleaseHandle; {если чей-то хинт yже был, то его погасить}
H:=THintWindow.Create(Окно-владелец хинта);
H.ActivateHint(H.CalcHintRect(...),'hint hint nint');
....
{UnПоявление :) - это возможно пpидется повесить на таймеp, котоpый бyдет
обнyляться пpи каждом новом появлении хинта}
IF h<>nil H.ReleaseHandle;

По-дpyгомy задача тоже pешаема, но очень плохо. (см исходник объекта TApplication, он как pаз сабжами заведyет.
НаверхПрислать свои комментарии

Как показать первый кадр AVI-файла?


Пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
   Application.ProcessMessages;
   MediaPlayer1.Open;
   Application.ProcessMessages;
   MediaPlayer1.Step;
   Application.ProcessMessages;
   MediaPlayer1.Previous;
end;



Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

Как заставить TEdit не 'пикать' при нажатии недопустимых клавиш?


Перехватите событие KeyPress и установите key = #0 для недопустимых клавиш.
Пример:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if ((UpCase(Key) < 'A') or (UpCase(Key) > 'Z')) then
       Key := #0;
end;


Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

Функция keybd_event() принимает значения до 244 - как мне отправить нажатие клавиши с кодом #255 в элемент управления Windows?


Это может понадобится для иностранных языков или для специальных символов. (например, в русских шрифтах символ с кодом #255 - я прописное). Приведенный в примере метод, не стоит использовать в случае если символ может быть передан обычным способом (функцией keybd_event()).

procedure TForm1.Button1Click(Sender: TObject);
var
   KeyData : packed record
       RepeatCount : word;
       ScanCode : byte;
       Bits : byte;
   end;
begin
   {Let the button repaint}
   Application.ProcessMessages;
   {Set the focus to the window}
   Edit1.SetFocus;
   {Send a right so the char is added to the end of the line}
   // SimulateKeyStroke(VK_RIGHT, 0);
   keybd_event(VK_RIGHT, 0,0,0);
   {Let the app get the message}
   Application.ProcessMessages;
   FillChar(KeyData, sizeof(KeyData), #0);
   KeyData.ScanCode := 255;
   KeyData.RepeatCount := 1;
   SendMessage(Edit1.Handle, WM_KEYDOWN, 255,LongInt(KeyData));
   KeyData.Bits := KeyData.Bits or (1 shl 30);
   KeyData.Bits := KeyData.Bits or (1 shl 31);
   SendMessage(Edit1.Handle, WM_KEYUP, 255, LongInt(KeyData));
   KeyData.Bits := KeyData.Bits and not (1 shl 30);
   KeyData.Bits := KeyData.Bits and not (1 shl 31);
   SendMessage(Edit1.Handle, WM_CHAR, 255, LongInt(KeyData));
   Application.ProcessMessages;
end;



Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

Как писать текст в StringGrid в стиле Exel (не обрезая, если он не помещается в ячейку)




procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
i, x, y: Integer;
begin
if gdFixed in State then Exit;
if ARow > 1 then Exit;
{Draw row 1 with text from cell 1,1 spanning all cells in the row}
with sender as TStringGrid do begin
{Extend rect to include grid line on right, if not last cell in row}
if aCol < Pred(ColCount) then
Rect.Right := Rect.Right + GridlineWidth;
{Figure out where the text of the first cell would start relative to the current cells rect}
y := Rect.Top + 2;
x := Rect.Left + 2;
for i:= 1 to aCol - 1 do
x := x - ColWidths[i] - GridlineWidth;
{Paint cell pale yellow}
Canvas.Brush.Color := $7FFFFF;
Canvas.Brush.Style := bsSolid;
Canvas.FillRect( Rect );
{Paint text of cell 1,1 clipped to current cell}
Canvas.TextRect( Rect, x, y, Cells[1, 1] );
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
i, k: Integer;
begin
with StringGrid1 do begin
cells[1, 1] := 'A rather long line which will span cells';
for i:= 1 to colcount-1 do
for k:= 2 to rowcount -1 do
cells[i,k] := Format( 'Cell[%d, %d]', [i, k]);
end;
end;

НаверхПрислать свои комментарии

Как извлечь Red, Green, и Blue компонент из определенного цвета?


Используйте функции Window API Get RValue(), GetGValue(), и GetBValue(). Пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Canvas.Pen.Color := clRed;
Memo1.Lines.Add('Red := ' + IntToStr(GetRValue(Form1.Canvas.Pen.Color)));
Memo1.Lines.Add('Red := ' + IntToStr(GetGValue(Form1.Canvas.Pen.Color)));
Memo1.Lines.Add('Blue:= ' + IntToStr(GetBValue(Form1.Canvas.Pen.Color)));
end;

НаверхПрислать свои комментарии

Как отображать ComboBox в текущей позиции курсора TMemo




unit CBoxInMemo;

interface

uses
Windows, Classes, Controls, Graphics, Forms, StdCtrls;

type
TFrmCboxInMemo = class(TForm)
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
ComboBox1: TComboBox;
procedure Button1Click(Sender: TObject);
procedure ComboBox1Exit(Sender: TObject);
procedure ComboBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmCboxInMemo: TFrmCboxInMemo;

implementation

{$R *.DFM}

procedure TFrmCboxInMemo.Button1Click(Sender: TObject);
var
clientPos: TPoint;
lineHeight: Integer;
tmpFont: TFont;
begin
GetCaretPos(clientPos);
{Use the following calculation of line height only if you want your combobox
to appear below the char position you are referencing.}
tmpFont := Canvas.Font;
Canvas.Font := Memo1.Font;
lineHeight := Canvas.TextHeight('Xy');
Canvas.Font := tmpFont;
with ComboBox1 do begin
{Adjustment of Top by lineHeight only necessary if combobox is to appear below line.}
Top := clientPos.Y + Memo1.Top + lineHeight;
Left := clientPos.X + Memo1.Left;
Visible := true;
SetFocus;
end;
end;

procedure TFrmCboxInMemo.ComboBox1Exit(Sender: TObject);
begin
ComboBox1.Visible := false;
end;

procedure TFrmCboxInMemo.ComboBox1Click(Sender: TObject);
begin
ComboBox1.Visible := false;
end;

end.

НаверхПрислать свои комментарии

Как заставить TMediaPlayer проигрывать одно и тоже бесконечно? AVI например?


В примере AVI файл проигрывается снова и снова - используем событие MediaPlayer'а Notify
Пример:

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
   with MediaPlayer1 do
       if NotifyValue = nvSuccessful then
           begin
               Notify := True;
               Play;
           end;
end;



Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

При показе максимизированное формы она перекрывает task bar и не выравнивается по верху экрана. В чем тут дело?


Это может произойти когда свойство position формы установленно в poScreenCenter.
Установите position = poDefault.
НаверхПрислать свои комментарии

Как изменить шрифт hint'а?


В примере перехватывается событие Application.OnShowHint и изменяется шрифт Hint'а.
Пример:

type
   TForm1 = class(TForm)
       procedure FormCreate(Sender: TObject);
   private
       {Private declarations}
   public
       procedure MyShowHint(var HintStr: string;
           var CanShow: Boolean;var HintInfo: THintInfo);
       {Public declarations}
end;

var
   Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.MyShowHint(var HintStr: string; var CanShow: Boolean;
                               var HintInfo: THintInfo);
var
   i : integer;
begin
   for i := 0 to Application.ComponentCount - 1 do
   if Application.Components[i] is THintWindow then
       with THintWindow(Application.Components[i]).Canvas do
           begin
               Font.Name:= 'Arial';
               Font.Size:= 18;
               Font.Style:= [fsBold];
               HintInfo.HintColor:= clWhite;
           end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Application.OnShowHint := MyShowHint;
end;



Источник: Дельфи. Вокруг да около.
НаверхПрислать свои комментарии

Как в RichEdit или TMemo реализовать при нажатии Enter-а позиционирование курстора в позицию
как в предыдущей строке




unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
RichEdit1: TRichEdit;
procedure RichEdit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses richedit;

{$R *.DFM}


procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
var
line, col, indent: integer;
S: String;
begin
if key = #13 then begin
key := #0;
with sender as TRichEdit do begin
{figure out line and column position of caret}
line := PerForm( EM_EXLINEFROMCHAR, 0, SelStart );
Col := SelStart - Perform( EM_LINEINDEX, line, 0 );
{get part of current line in front of caret}
S:= Copy( lines[ line ], 1, col );
{count blanks and tabs in this string}
indent := 0;
while (indent < length( S )) and (S[indent + 1] in [' ', #9])
do
Inc( indent );
{insert a linebreak followed by the substring of blanks and tabs}
SelText := #13#10 + Copy(S, 1, indent);
end;
end;
end;

end.
НаверхПрислать свои комментарии

Как сменить дисковод, откуда MediaPlayer проигрывает аудио CD?


Пример:

MediaPlayer1.FileName := 'E:';


НаверхПрислать свои комментарии

Я хочу вставить escape code в строку при использовании функции Format(). Например, я хочу создать строку, содержащую символ табуляции. В "C" я бы написал что-то вроде sprintf(buffer, "%s\t%s", str);. А как это будет на Pascal'e?


Функция Format Pascal'я не использует escape codes. Вместо этого нужно вставить в строку действительное значение символа в кодировке ASCII.
Пример:

Buffer := Format('%s'#9'%s', [Str1, Str2]);
ShowMessage(Format('%s'#9'%s', ['Column1', 'Column2']));


НаверхПрислать свои комментарии

Как запретить изменение размера моего компонента в design-time?


Поместите в конструктор компонента код, устанавливающий размеры по умолчанию. Переопределите метод SetBounds и проверяйте в нем "componentstate". Если компонет находится режиме "design-time" (csDesigning in ComponentState) просто передавайте значения ширины и высоты (width и heights) компонента по умолчанию (в нашем примере 50) методу класса-предка.

Пример:

procedure TVu.SetBounds(ALeft : integer; ATop : integer; AWidth : integer;
           AHeight : integer);
begin
   if csdesigning in componentstate then
   begin
       AWidth := 50;
       AHeight := 50;
       inherited; //вызываем унаследованный от предка метод
   end;
end;



Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

Есть ли в Delphi эквивалент функции SendKeys Visual Basic'а?


Ниже приведена процедура, позволяющаю отправлять нажатия в любой элемент управления (window control), способный принимать ввод с клавиатуры. Вы можете использовать эту технику чтобы включать клавиши NumLock, CapsLock и ScrollLock под Windows NT. Та же техника работает и под Windows 95 для CapsLock и ScrollLock но не работает для клавиши NumLock.
Обратите внимание, что приведены четыре поцедуры: SimulateKeyDown() - эмулировать нажатие клавиши (без отпускания) SimulateKeyUp() - эмулировать отпускание клавиши SimulateKeystroke() - эмулировать удар по клавише (нажатие и отпускание) и SendKeys(), позволяющие Вам гибко контролировать посылаемые сообщения клавиатуры.
SimulateKeyDown(), SimulateKeyUp() и SimulateKeystroke() получают коды виртуальных клавиш (virtural key) (вроде VK_F1). Процедура SimulateKeystroke() получает дополнительный параметр, полезный при эмуляции нажатия PrintScreen. Когда этот параметр равен нулю весь экран будет скопирован в буфер обмена (clipboard). Если дополнительный параметр равен 1 будет скопированно только активное окно.
Четыре метода "button click" демонстрируют использование: ButtonClick1 - включает capslock ButtonClick2 - перехватывает весь экран в буфер обмена (clipboard). ButtonClick3 - перехватывает активное окно в буфер обмена (clipboard). ButtonClick4 - устанавливает фокус в Edit и отправляет в него строку.
Пример:

procedure SimulateKeyDown(Key : byte);
begin
   keybd_event(Key, 0, 0, 0);
end;

procedure SimulateKeyUp(Key : byte);
begin
   keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;

procedure SimulateKeystroke(Key : byte; extra : DWORD);
begin
   keybd_event(Key,extra,0,0);
   keybd_event(Key,extra,KEYEVENTF_KEYUP,0);
end;

procedure SendKeys(s : string);
var
   i : integer;
   flag : bool;
   w : word;
begin
   {Get the state of the caps lock key}
   flag := not GetKeyState(VK_CAPITAL) and 1 = 0;
   {If the caps lock key is on then turn it off}
   if flag then
       SimulateKeystroke(VK_CAPITAL, 0);
   for i := 1 to Length(s) do
       begin
           w := VkKeyScan(s[i]);
           {If there is not an error in the key translation}
           if ((HiByte(w) <> $FF) and (LoByte(w) <> $FF)) then
               begin
                   {If the key requires the shift key down - hold it down}
                   if HiByte(w) and 1 = 1 then
                       SimulateKeyDown(VK_SHIFT);
                       {Send the VK_KEY}
                   SimulateKeystroke(LoByte(w), 0);
                   {If the key required the shift key down - release it}
                   if HiByte(w) and 1 = 1 then
                       SimulateKeyUp(VK_SHIFT);
               end;
       end;
{if the caps lock key was on at start, turn it back on}
if flag then
   SimulateKeystroke(VK_CAPITAL, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   {Toggle the cap lock}
   SimulateKeystroke(VK_CAPITAL, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   {Capture the entire screen to the clipboard}
   {by simulating pressing the PrintScreen key}
   SimulateKeystroke(VK_SNAPSHOT, 0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   {Capture the active window to the clipboard}
   {by simulating pressing the PrintScreen key}
   SimulateKeystroke(VK_SNAPSHOT, 1);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
   {Set the focus to a window (edit control) and send it a string}
   Application.ProcessMessages;
   Edit1.SetFocus;
   SendKeys('Delphi Is RAD!');
end;


Источник: Дельфи. Вокруг да около.



НаверхПрислать свои комментарии

Как разместить прозрачную надпись на TBitmap?


Пример:

procedure TForm1.Button1Click(Sender: TObject);
var
OldBkMode : integer;
begin
Image1.Picture.Bitmap.Canvas.Font.Color := clBlue;
OldBkMode := SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,TRANSPARENT);
Image1.Picture.Bitmap.Canvas.TextOut(10, 10, 'Hello');
SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,OldBkMode);
end;


Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

При выполнении диалога FontDialog со свойством Device равным fdBoth or fdPrinter, появляется ошибка "There are no fonts installed".


Эти установки должны показать шрифты совместимые либо с принтером либо с экраном. В примере диалог Windows ChooseFont вызывается напрямую чтобы показать список шрифтов, совместимых одновременно и с экраном и с принтером.
Пример:

uses Printers, CommDlg;

procedure TForm1.Button1Click(Sender: TObject);
var
   cf : TChooseFont;
   lf : TLogFont;
   tf : TFont;
begin
   if PrintDialog1.Execute then
       begin
           GetObject(Form1.Canvas.Font.Handle, sizeof(lf),@lf);
           FillChar(cf, sizeof(cf), #0);
           cf.lStructSize := sizeof(cf);
           cf.hWndOwner := Form1.Handle;
           cf.hdc := Printer.Handle;
           cf.lpLogFont := @lf;
           cf.iPointSize := Form1.Canvas.Font.Size * 10;
           cf.Flags := CF_BOTH or CF_INITTOLOGFONTSTRUCT or
               CF_EFFECTS or CF_SCALABLEONLY or CF_WYSIWYG;
           cf.rgbColors := Form1.Canvas.Font.Color;
           if ChooseFont(cf) <> false then
               begin
                   tf := TFont.Create;
                   tf.Handle := CreateFontIndirect(lf);
                   tf.COlor := cf.RgbColors;
                   Form1.Canvas.Font.Assign(tf);
                   tf.Free;
                   Form1.Canvas.TextOut(10, 10, 'Test');
               end;
       end;
end;



Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

Как преобразовать цвета в строку - название цвета VCL?


Модуль graphics.pas содержит функцию ColorToString() которое преобразует допустимое значение TColor в его строковое представление используя либо константу-название цвета (по возможности) либо шестнадцатиричную строку. Обратная функция - StringToColor()
Пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
   Memo1.Lines.Add(ColorToString(clRed));
   Memo1.Lines.Add(IntToStr(StringToColor('clRed')));
end;


Источник: Дельфи. Вокруг да около.


НаверхПрислать свои комментарии

Как получить число и список всех компонентов, расположенных на TNoteBook?


В примере список выводится на Listbox.
Пример:

procedure TForm1.Button1Click(Sender: TObject);
var
   n: integer;
   p: integer;
begin
   ListBox1.Clear;
   with Notebook1 do
   begin
       for n := 0 to ControlCount - 1 do
       begin
           with TPage(Controls[n]) do
           begin
               ListBox1.Items.Add('Notebook Page: ' +
               TPage(Notebook1.Controls[n]).Caption);
               for p := 0 to ControlCount - 1 do
               ListBox1.Items.Add(Controls[p].Name);
               ListBox1.Items.Add(EmptyStr);
           end;
       end;
   end;
end;


Источник: Дельфи. Вокруг да около.
НаверхПрислать свои комментарии

Как программно перевести DBgrid в реим редактирования и установить курсор в окошке редактирования в требуемую позицию?


Переведите таблицу в режим редактирования, затем получите дескриптор (handle) окна редактирования и перешлите ей сообщение EM_SETSEL. В качестве параметров вы должны переслать начальную позицию курсора, и конечную позицию, определяющую конец выделения текста цветом. В приведенном примере курсор помещается во вторую позицию, текст внутри ячейки не выделяется.
Пример:

procedure TForm1.Button1Click(Sender: TObject);
var
   h : THandle;
begin
   Application.ProcessMessages;
   DbGrid1.SetFocus;
   DbGrid1.EditorMode := true;
   Application.ProcessMessages;
   h:= Windows.GetFocus;
   SendMessage(h, EM_SETSEL, 2, 2);
end;



Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

Я хочу создать в своей программе меню "а ля Дельфи 4". Как это сделать?


1. Разместите на форме TControlBar. (закладка Additional) Установите Align = Client.
2. Разместите TToolBar (закладка Win32) внутри TControlBar.
3. Установите в True свойства Flat и ShowCaptions этого TToolBar.
4. Создайте на TToolBar столько TToolButtons сколько Вам нужно. (щелкнув по TToolBar
   правой кнопкой и выбрав NewButton)
5. Установите свойство Grouped = True для всех TToolButtons. Это позволит меню выпадать
   при перемещении курсора между главными пунктами меню (если меню уже показано).
6. Разместите на фоме TMainMenu и убедитесь, что оно *НЕ присоденено* как меню главной
   формы. (посмотрите свойство Menu формы).
7. Создайте все пункты меню (щелкнув по TMainMenu кнопкой и выбрав Menu Designer)
8. Для каждой TToolButton установите ее MenuItem равным соответсвующему пункту TMainMenu.


Источник: Дельфи. Вокруг да около.


НаверхПрислать свои комментарии

Вставить Combobox в DBGrid


»»» Dim (18.08.00 09:38)
Подскажите как можно вставить выпадающий список в DBGrid, желательно по подробней.

Заранее благодарен
Дмитрий.

»»» Gurin Sergey - asmad@tsure.ru (18.08.00 10:29)
1. Дважды щелкнуть на DBGrid
2. Добавить колонку
3. Указать поле которое будет показываться (свойство FieldName)
4. Заполнить список (свойство PickList)

»»» dim - eda@arhadm.net.ru (18.08.00 12:05)
А можно в место заполнения списка подключить сразу таблицу?

»»» Mike Goblin - mgoblin@mail.ru (18.08.00 14:38)
Да можно, Вам нужно в компоненте данных сделать Lookup поле.
1. Дважды щелкнуть мышкой на допустим TTable появится редактор полей
2. В редакторе полей правой кнопкой и New Field
3. Появится диалог в нем тип поля Lookup, настоить остальные св-ва (если надо подробнее про другие св-ва пишите).

»»» dim - eda@arhadm.net.ru (18.08.00 15:29)
Если не затруднит, то от описания я бы не отказался

»»» Mike Golovanov - mgoblin@mail.ru (21.08.00 09:06)
Итак, есть две таблицы, одна из них содержит ссылку (числовой ID)
на вторую, где есть текствое описание чего-либо. Допустим - это таблица
человек и его специальность.
Наша цель - сделать так, чтобы при вводе/редактировании ФИО человека итд
в DBGrid из выпадающего списка можно было выбрать специальность.
Таблица человек --> Table1
Таблица специальности --> Table2
Путь решения - создание Lookup поля в Table1. Этапы
1. Вызываем редактор полей Table1, Click мышой
2. В редакторе полей правой кнопкой и New Field -> видим диалог
3. В диалоге
Name --> Profession (или как Вы его обзовете)
Type --> String
Size --> длина наименования профессии в Table2
FieldType --> Lookup
KeyFields --> имя числового поля Table1, в которое связывает нас с
Table2 (например prof_id)
Dataset --> откуда мы будем брать строки описания, т.е Table2
LookupKeys --> Ключевое поле Table2
ResultField --> наименование профессии из Table2
Жмем ОК
Теперь в DBGrid для Table1 данное поле будет содержать выпадающий список
с профессиями из Table2


»»» dim - eda@arhadm.net.ru (21.08.00 09:10)
Спасибо за описание, но есть еще вопрос:
Если нет к примеру такой професии, то как добавить новую через это же поле?

»»» Mike Goblin - mgoblin@mail.ru (21.08.00 13:02)
проще всего добавить в Table2 новую запись

-= Из конференции сайта MASTERS OF DELPHI (http://delphi.mastak.com) =-
НаверхПрислать свои комментарии

На некоторых laptop компьютерах может не быть флоппи дисковода. Можно ли удалять из списка TDriveComboBox диски которые отключены?


В примере TDriveComboBox не показывает дисководы, которые не готовы. (not ready).
Учтите что на многих компьютерах будет ощутимая задержка при поверке plug&play флоппи дисковода.
Пример:

procedure TForm1.FormCreate(Sender: TObject);
var
   i : integer;
   OldErrorMode : Word;
   OldDirectory : string;
begin
   OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
   GetDir(0, OldDirectory);
   i := 0;
   while i <= DriveComboBox1.Items.Count - 1 do begin
   {$I-}
   ChDir(DriveComboBox1.Items[i][1] + ':\');
   {$I+}
   if IoResult <> 0 then
       DriveComboBox1.Items.Delete(i)
   else
       inc(i);
   end;
   ChDir(OldDirectory);
   SetErrorMode(OldErrorMode);
end;


Источник: Дельфи. Вокруг да около.

НаверхПрислать свои комментарии

Где в Delphi обьявленны VK_Key для A-Z и 0-9?


Они не обьявлены в Delphi поскольку они просто могуть быть заменены буквами.
VK_0 до VK_9 то же что и ASCII '0' до '9' ($30 - $39),
VK_A до VK_Z то же что и ASCII 'A' до 'Z' ($41 - $5A).

НаверхПрислать свои комментарии


Сайт клуба любителей Delphi - Masters of Delphi
Designed by MoveR Studio © 2000  - | -  Вопросы? Предложения? пишите