Часть [1] - Часть [2]

31. Как в Edit1 написать Real`ную переменную и наоборот ?

32. Как имена полей БД записать в список ListBox или ComboBox ?

33. Как сделать нужную ячейку StringGrid активной ?

34. Как программно вырезать часть картинки ?

35. Как сделать фон формы в виде картинки ?

36. Как на форме оставить след от движения мыши ?

37. Как для каждого сотрудника в БД загрузить его фотографию ?

38. Как сделать ограничения на изменение размера формы ?

39. Как получить имя пользователя и организации ?

40. Как закрыть чужую программу ?

41. Можно ли создать свой собственный цвет форме или компоненту ?

42. Как запретить выполнение обработчика события, например, нажатия кнопки ?

43. Как вывести сообщение, используя данные введенные юзером ?

44. Как сделать разноязычный интерфейс программы ?

45. Как добавить программу в автозапуск Windows ?

46. Как извлечь иконку из чужой программы ?

47. Как сделать, чтобы при изменении цены или количества товара, сразу же...

48. Как вызвать Pop-Up меню не используя правую кнопку мыши ?

49. Как загрузить картинку в BLOB-поле и потом ее от туда извлечь?

50. Как сделать выравнивание по центру или правому краю в Edit ?

51. Как ассоциировать расширение файла с моей программой ?

52. Как получить содержимое ячейки DBGrid ?

53. Как получить имя файла без расширения ?

54. Как преобразовать BMP в JPEG и наоборот ?

55. Кaк мнe уcтaнoвить пpoгpaммнo зaдepжку для Hint ?

56. Как программно выключить компьютер ?

57. Как проверить нажатие функциональных клавиш ?

58. Как заставить нажаться TButton правой кнопкой мыши ?

59. Как получить координаты курсора мыши относительно формы ?

60. Как узнать и поменять разрешение экрана ?



Вопрос № 31: Как в Edit1 написать Real`ную переменную и наоборот ?

Ответ: Для это существуют функции FloatToStr и StrToFloat:

procedure TForm1.Button1Click(Sender: TObject);
Var A, B: Real;
begin
 A:=4.5;
 Edit1.Text:=FloatToStr(A);
 B:=StrToFloat(Edit1.Text);
end;


Вопрос № 32: Как имена полей БД записать в список ListBox или ComboBox ?

Ответ:См. пример:

procedure TForm1.Button1Click(Sender: TObject);
Var I: Integer;
begin
 ListBox1.Clear;
 For I:=0 To Query1.FieldCount-1 Do
   ListBox1.Items.Add(Query1.Fields[I].FieldName);
end;


Вопрос № 33: Как сделать нужную ячейку StringGrid активной ?

Ответ:Нужно просто задать строку и столбец сетки:

procedure TForm1.Button1Click(Sender: TObject);
begin
 StringGrid1.Row:=1;
 StringGrid1.Col:=2;
 If StringGrid1.CanFocus Then StringGrid1.SetFocus;
end;


Вопрос № 34: Как программно вырезать часть картинки ?

Ответ:См. пример (немного грубоватый):

procedure TForm1.Button1Click(Sender: TObject);
Var JPG: TJPEGImage;
    BMP: TBitmap;
begin
 JPG:=TJPEGImage.Create;
 BMP:=TBitmap.Create;

 If OpenPictureDialog1.Execute Then
   Begin
     If ExtractFileExt(OpenPictureDialog1.FileName) = '.jpg' Then
       Begin
         JPG.LoadFromFile(OpenPictureDialog1.FileName);
         BMP.Assign(JPG);
         BMP.Width:=200;
         BMP.Height:=150;
         JPG.Assign(BMP);
         JPG.SaveToFile('New_Picture.jpg');
       End
     Else
       If ExtractFileExt(OpenPictureDialog1.FileName) = '.bmp' Then
         Begin
           BMP.LoadFromFile(OpenPictureDialog1.FileName);
           BMP.Width:=200;
           BMP.Height:=150;
           BMP.SaveToFile('New_Picture.bmp');
         End;
   End;   

 JPG.Free;
 BMP.Free;
end;


Вопрос № 35: Как у формы сделать фон в виде картинки ?

Ответ:См. 2 примера:

procedure TForm1.Button1Click(Sender: TObject);
Var BMP: TBitmap;
begin
 BMP:=TBitmap.Create;
 BMP.LoadFromFile('Picture.bmp');
 Form1.Canvas.Brush.Bitmap:=BMP;
 Form1.Canvas.FillRect(Rect(0, 0, Screen.Width, Screen.Height));
 BMP.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var BMP: TBitmap;
begin
 BMP:=TBitmap.Create;
 BMP.LoadFromFile('Picture.bmp');
 Form1.Canvas.Draw(0, 0, BMP);
 BMP.Free;
end;


Вопрос № 36: Как на форме оставить след от движения мыши ?

Ответ:См. пример:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 If Shift = [ssLeft] Then
   Begin
     Form1.Canvas.LineTo(Mouse.CursorPos.X, Mouse.CursorPos.Y-20);
   End;
end;


Вопрос № 37: Как для каждого сотрудника в БД загрузить его фотографию ?

Ответ: Для этого существуют так называемые Blob-поля. См. пример:

// Загружаем картинку в поле текущей записи
procedure TForm1.Button1Click(Sender: TObject);
begin
 If OpenPictureDialog1.Execute Then
   Begin
     Table1.Edit;
     TBLOBField(Table1.FieldByName('Photo')).LoadFromFile(OpenPictureDialog1.FileName);
   End;
end;

// Очищаем поле с картинкой текущей записи
procedure TForm1.Button2Click(Sender: TObject);
begin
 Table1.Edit;
 TBLOBField(Table1.Fields[1]).Clear;
end;


Вопрос № 38: Как сделать ограничения на изменение размера формы ?

Ответ: Чтобы форме нельзя было изменить размер можно поиграть свойством BorderStyle и обходить стороной значение bsSizeable. Либо написать свой обработчик события изменения размеров формы. Но, не нужно забывать и о свойстве BorderIcon, в котором значению biMaximize нужно задать значение False. См. пример:

procedure TForm1.FormResize(Sender: TObject);
begin
 If (Form1.Width >= 100) OR (Form1.Width <= 100) OR
    (Form1.Height >= 100) OR (Form1.Height <= 100)
   Then
     Begin
       Form1.Width:=100;
       Form1.Height:=100
     End;
end;


Вопрос № 39: Как получить имя пользователя и организации ?

Ответ: Все эти значения можно найти в реестре по адресу:
HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion

где,

RegisteredOrganization - Организация.
RegisteredOwner - Имя владельца.

А по адресу HKEY_LOCAL_MACHINE\System\Control\ComputerName\ComputerName
можно узнать имя компьютера, заданное при инсталляции Windows.



Вопрос № 40: Как закрыть чужую программу ?

Ответ: См. пример:

procedure TForm1.Button1Click(Sender: TObject);
Var H: HWND;
begin
 H:=FindWindow(Nil, 'WinRar - WinRar');
 If H <> 0 Then SendMessage(H, WM_CLOSE, 0, 0);
end;


Вопрос № 41: Можно ли создать свой собственный цвет форме или компоненту ?

Ответ: Вот небольшой рабочий пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form1.Color:=RGB(StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text));
 Label1.Color:=PaletteRGB(StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text));
end;


Вопрос № 42: Как запретить выполнение обработчика события, например, нажатия кнопки ?

Ответ: Например, вот так:

procedure TForm1.FormCreate(Sender: TObject);
begin
 If Edit1.Text = '' Then Button1.OnClick:=Nil
   Else Button1.OnClick:=Button1Click;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 If CheckBox1.Checked Then Button2.OnClick:=Nil
   Else Button2.OnClick:=Button2Click;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(Button1.ClassName);
end;


Вопрос № 43: Как вывести сообщение, используя данные введенные юзером ?

Ответ: Здесь просто нужно строку преобразовать к типу PChar:


Application.MessageBox(PChar('Запись с номером ''' + edtCode.Text +
                             ''' в базе уже существует !'),
                             'Ошибка:', MB_OK);



Вопрос № 44: Как сделать разноязычный интерфейс программы ?

Ответ: Для этого нужно создать текстовый INI-файлы со значениями, например, заголовков компонентов, которые будут загружены при смене языка. Для примера создадим файл Russian.lng и English.lng, примерно со следующим содержанием:

; Russian.lng
[Menu File]
mnuFile=Файл
mnuFileOpen=Открыть
mnuFileSave=Сохранить
mnuFileExit=Выход

[Menu Language]
mnuLanguage=Язык
mnuLanguageRus=Русский
mnuLanguageEng=Английский

[Menu Help]
mnuHelp=Справка
mnuGetHelp=Помощь
mnuAbout=О программе...
; English.lng
[Menu File]
mnuFile=File
mnuFileOpen=Open
mnuFileSave=Save
mnuFileExit=Exit

[Menu Language]
mnuLanguage=Language
mnuLanguageRus=Russian
mnuLanguageEng=English

[Menu Help]
mnuHelp=Help
mnuGetHelp=Help
mnuAbout=About...
// Русский интерфейс
procedure TForm1.mnuLanguageRusClick(Sender: TObject);
Var Ini: TIniFile;
begin
 Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Russian.lng');

 mnuFile.Caption:=Ini.ReadString('Menu File', 'mnuFile', 'Файл');
 mnuFileOpen.Caption:=Ini.ReadString('Menu File', 'mnuFileOpen', 'Открыть');
 mnuFileSave.Caption:=Ini.ReadString('Menu File', 'mnuFileSave', 'Сохранить');
 mnuFileExit.Caption:=Ini.ReadString('Menu File', 'mnuFileExit', 'Выход');

 mnuLanguage.Caption:=Ini.ReadString('Menu Language', 'mnuLanguage', 'Язык');
 mnuLanguageRus.Caption:=Ini.ReadString('Menu Language', 'mnuLanguageRus', 'Русский');
 mnuLanguageEng.Caption:=Ini.ReadString('Menu Language', 'mnuLanguageEng', 'Английский');

 mnuHelp.Caption:=Ini.ReadString('Menu Help', 'mnuHelp', 'Справка');
 mnuGetHelp.Caption:=Ini.ReadString('Menu Help', 'mnuGetHelp', 'Помощь');
 mnuAbout.Caption:=Ini.ReadString('Menu Help', 'mnuAbout', 'О программе...');

 Ini.Free;
end;

// Английский интерфейс
procedure TForm1.mnuLanguageEngClick(Sender: TObject);
Var Ini: TIniFile;
begin
 Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName) + 'English.lng');

 mnuFile.Caption:=Ini.ReadString('Menu File', 'mnuFile', 'File');
 mnuFileOpen.Caption:=Ini.ReadString('Menu File', 'mnuFileOpen', 'Open');
 mnuFileSave.Caption:=Ini.ReadString('Menu File', 'mnuFileSave', 'Save');
 mnuFileExit.Caption:=Ini.ReadString('Menu File', 'mnuFileExit', 'Exit');

 mnuLanguage.Caption:=Ini.ReadString('Menu Language', 'mnuLanguage', 'Language');
 mnuLanguageRus.Caption:=Ini.ReadString('Menu Language', 'mnuLanguageRus', 'Russian');
 mnuLanguageEng.Caption:=Ini.ReadString('Menu Language', 'mnuLanguageEng', 'English');

 mnuHelp.Caption:=Ini.ReadString('Menu Help', 'mnuHelp', 'Help');
 mnuGetHelp.Caption:=Ini.ReadString('Menu Help', 'mnuGetHelp', 'Help');
 mnuAbout.Caption:=Ini.ReadString('Menu Help', 'mnuAbout', 'About...');

 Ini.Free;
end;


Вопрос № 45: Как добавить программу в автозапуск Windows ?

Ответ:См. пример:

...
Var Reg     : TRegistry;
    RegPath : String;
begin
 Reg:=TRegIniFile.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 RegPath:='\Software\Microsoft\Windows\CurrentVersion\Run';
 If Reg.OpenKey(RegPath, False) Then
   If Reg.ReadString(RegPath) = ''
     Then Reg.WriteString('ProgName', ExtractFilePath(Application.ExeName) + 'ProgName');
 Reg.Free;
end;


Вопрос № 46: Как извлечь иконку из чужой программы ?

Ответ:См. пример:

...
Var HIco : HIcon;
    TIco : TIcon;
    I    : Integer;
begin
  I:=0;
  Repeat
    HIco:=ExtractIcon(Handle, PChar(OpenDialog1.FileName), I);
    If HIco > 0 Then
      Begin
        TIco.Handle:=HIco;
        TIco.SaveToFile(IntTostr(I) + '.ico');
        Inc(I);
      End;
  Until HIco = 0;
end;


Вопрос № 47: Как сделать, чтобы при изменении цены или количества товара, сразу же пересчитывалась итоговая сумма ?

Ответ:Нужно отслеживать обработчик события нажатия клавиш сетки DBGrid:

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 Table1.Edit;
  Table1.FieldByName('Itogo').AsFloat:=
   Table1.FieldByName('Cena').AsFloat * Table1.FieldByName('Kol_Vo').AsFloat;
end;


Вопрос № 48: Как вызвать Pop-Up меню не используя правую кнопку мыши ?

Ответ: Используйте метод Popup(X, Y):

procedure TForm1.Button1Click(Sender: TObject);
begin
 PopupMenu1.Popup(100, 50);
end;


Вопрос № 49: Как загрузить картинку в BLOB-поле и потом ее от туда извлечь?

Ответ:См. пример:

// Загружаем картинку
procedure TForm1.Button1Click(Sender: TObject);
begin
 If OpenPictureDialog1.Execute Then
   Begin
     Table1.Edit;
     TBLOBField(Table1.FieldByName('gr')).LoadFromFile(OpenPictureDialog1.FileName);
   End;
end;

// Сохраняем картинку
procedure TForm1.Button1Click(Sender: TObject);
begin
 If SavePictureDialog1.Execute
   Then TBLOBField(Table1.FieldByName('gr')).SaveToFile(SaveDialog1.FileName);
end;


Вопрос № 50: Как сделать выравнивание по центру или правому краю в Edit ?

Ответ: Можно использовать Memo, но предватирельно запретить нажатия клавиш управления курсором вверх (#38), вниз (#40), Enter.

procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Clear;
 Memo1.Alignment:=taCenter;
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
 If Key In [#13] Then Key:=#0;
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 If Key In [38, 40] Then Key:=0;
end;


Вопрос № 51: Как ассоциировать расширение файла с моей программой ?

Ответ: См. пример:

procedure TForm1.FormCreate(Sender: TObject);
Var I        : Integer;
    NameFile : String;
begin
 Try
   // Загружаем выбранный файл в редактор
   If ParamCount > 0 Then
     For I:=1 To ParamCount Do NameFile:=ParamStr(I);
   If NameFile <> '' Then Memo1.Lines.LoadFromFile(NameFile);
 Except
 End;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var Reg : TRegistry;
begin
 Reg:=TRegIniFile.Create;
 Reg.RootKey:=HKEY_CLASSES_ROOT;
 If NOT Reg.KeyExists('.ttt') Then Reg.CreateKey('.ttt');
 If Reg.OpenKey('.ttt', False) Then
   Begin
     Reg.WriteString('', 'ttt_text_file');
     Reg.CloseKey;
   End;

 If NOT Reg.KeyExists('ttt_text_file') Then
   Begin
     Reg.CreateKey('ttt_text_file');
     If Reg.OpenKey('ttt_text_file', False)
       Then Reg.WriteString('', 'Файл TTT');
     Reg.CloseKey;
   End;

 If NOT Reg.KeyExists('ttt_text_file\shell') Then
   Begin
     Reg.CreateKey('ttt_text_file\shell');
     Reg.CloseKey;
   End;

 If NOT Reg.KeyExists('ttt_text_file\shell\open') Then
   Begin
     Reg.CreateKey('ttt_text_file\shell\open');
     If Reg.OpenKey('ttt_text_file\shell\open', False)
       Then Reg.WriteString('', '');
     Reg.CloseKey;
   End;

 If NOT Reg.KeyExists('ttt_text_file\shell\open\command') Then
   Begin
     Reg.CreateKey('ttt_text_file\shell\open\command');
     If Reg.OpenKey('ttt_text_file\shell\open\command', False)
       Then Reg.WriteString('', Application.ExeName + ' "%1"');
     Reg.CloseKey;
   End;

 Reg.Free;
end;


Вопрос № 52: Как получить содержимое ячейки DBGrid ?

Ответ:Например, вот так:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Caption:=DBGrid1.Columns.Grid.SelectedField.Text;
end;


Вопрос № 53: Как получить имя файла без расширения ?

Ответ: См. пример:

procedure TForm1.Button1Click(Sender: TObject);
Var J     : Integer;
    FName : String;
begin
 Repeat
   Inc(J);
   If ExtractFileName(OpenDialog1.FileName)[J] <> '.' Then
   FName:=FName + ExtractFileName(OpenDialog1.FileName)[J];
 Until (Length(ExtractFileName(OpenDialog1.FileName))= 0) OR
       (ExtractFileName(OpenDialog1.FileName)[J] = '.');
end;


Вопрос № 54: Как преобразовать BMP в JPEG и наоборот ?

Ответ:См. пример:

procedure TForm1.Button2Click(Sender: TObject);
Var BMP: TBitmap;
    JPG: TJPEGImage;
begin
 BMP:=TBitmap.Create;
 JPG:=TJPEGImage.Create;

 // Преобразование BMP в JPG 
 BMP.LoadFromFile('Picture.bmp');
 JPG.Assign(BMP);
 JPG.SaveToFile('C:\Pic_JPG.jpg');

 // Преобразование JPG в BMP
 JPG.LoadFromFile('Picture.jpg');
 BMP.Assign(JPG);
 BMP.SaveToFile('C:\Pic_BMP.bmp');

 JPG.Free;
 BMP.Free;
end;


Вопрос № 55: Кaк мнe уcтaнoвить пpoгpaммнo зaдepжку для Hint ?

Ответ:Вот так:

Application.HintHidePause:=5000;
// А так можно регулировать время появления подсказки 
Application.HintPause:=1000;


Вопрос № 56: Как программно выключить компьютер ?

Ответ:См. пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ExitWindowsEx(EWX_SHUTDOWN, 1);
  // А так перезугрузить
 ExitWindowsEx(EWX_REBOOT, 1);
end;


Вопрос № 57: Как проверить нажатие функциональных клавиш ?

Ответ: Для этого существует функция GetKeyState, которая возвращает 1 если функциональная кнопка нажата и 0, если функциональная кнопка не нажата.

...
Application.OnIdle:=IdleProc;
...

procedure IdleProc;
Begin
 If GetKeyState(VK_NUMLOCK) = 1 Then Labe1.Caption:='NumLock'
   Else
 If GetKeyState(VK_CAPITAL)=1 Then Labe1.Caption:='CapsLock'
   Else
 If GetKeyState(VK_SCROLL)=1 Then Labe1.Caption:='ScrollLock';

 Done:=False;
End;


Вопрос № 58: Как заставить нажаться TButton правой кнопкой мыши ?

Ответ:См. пример:

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 If Button = mbRight Then Button1Click(Sender);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage('Вы нажали одну из кнопок мыши !!!');
end;


Вопрос № 59: Как получить координаты курсора мыши относительно формы ?

Ответ: См. пример:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 Caption:=IntToStr(Mouse.CursorPos.X) + '/' + IntToStr(Mouse.CursorPos.Y) 
end;


Вопрос № 60: Как узнать и поменять разрешение экрана ?

Ответ: Как поменять я пока не знаю, а вот узнать можно так:

...
Form1.Caption:=IntToStr(Screen.Width) + '/' + IntToStr(Screen.Height);
...



Вернуться в оглавление
Вернуться на главную страницу
Hosted by uCoz