faqs.org.ru

 Главная > Программирование > Языки Pascal/Delphi >

RU.DELPHI FAQ

Секция 2 из 5 - Предыдущая - Следующая
Все секции - 1 - 2 - 3 - 4 - 5


------------------------------------------------------------
Q-25:  Как сделать так, чтобы программу можно было запустить только в одном
экземпляре?
------------------------------------------------------------
Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для
завершения второго экземпляра используйте Application.Terminate.

(AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция
IsMonitorRunning().

------------------------------------------------------------
Q-26:  Как мне вывести какое-нибудь окошко с картинкой, пока программа
грузится?
------------------------------------------------------------
Смотрите пример в X:\DELPHI\DEMOS\DB\MASTAPP\mastapp.dpr.

Удобно использовать функцию ShowSplashWindow из rxLib.

------------------------------------------------------------
Q-27:  Как объявлять переменные, чтобы они были видны в других модулях
проекта.
------------------------------------------------------------
Лучше всего создать отдельный модуль для таких переменных, назвать его
скажем ComVars.pas и подключать его в остальных модулях.

unit ComVars;

interface

var
  MyVar : Integer

implementation
end.

Кроме этого модуля полезно создать еще два

ComConst - для общих констант
ComUtils - для общих процедур

------------------------------------------------------------
Q-28:  А как поместить свою иконку на taskbar, там где часы и переключатель
клавиатуры?
------------------------------------------------------------
(Этот вопрос получил первый приз).

В библиотеке rxLib есть компонент TrxTrayIcon. Заметьте, что для корректного
завершения работы операционной системе вам потребуется обрабатывать
сообщение WM_QUERYENDSESSION.

------------------------------------------------------------
Q-29:  Как форматировать денежные суммы, чтобы было видно всегда два знака
после запятой
------------------------------------------------------------
Использовать для форматирования фунцию FormatFloat('0.00',Variable) для
переменных типа Float

Для переменных типа Currency функцию CurrToStrF

Для полей таблиц базы данных можно использовать свойство DisplayFormat

Олег Степанов
------------------------
Можно использовать переменную CurrencyDecimals := 2;
Особенно помогает в Win95, где в установках по умолчанию обычно нет копеек
(их в те времена и не было в России ;-).
Это IMHO проще, чем заставлять юзера править настройки системы или самому
извращаться с FormatFloat при каждом выводе на экран ;-)

------------------------------------------------------------
Q-30:  Как сделать плавно изменяющийся цвет заголовка окна, как в
MSOffice'95?
------------------------------------------------------------
В rxLib есть TGradientCaption.

------------------------------------------------------------
Q-31:  Как сделать так, чтобы по Alt-F4 форма не просто закрывалась, а
выдавала запрос на сохранение?
------------------------------------------------------------
Обрабатывать OnCloseQuery.

CanClose := Application.MessageBox('Закрыть программу?', 'Запрос',
MB_OKCANCEL + MB_DEFBUTTON1) <> IDOK;
+++++++++++++++++++++++++++++++

procedure TForm1.WMQueryEndSession; // message WM_QUERYENDSESSION;
{расскоментировать // message .. в объявлении TForm1}
begin
  FReason := 1; // поле формы : Longint;
  msg.Result := LParam(True);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if (FReason = 0) then
    case Application.MessageBox( 'Сохранить данные?',
                                 'Запрос',
                                 MB_YESNOCANCEL + MB_DEFBUTTON1) of
       mrYes: FReason := 2;
       mrNo: ;
       mrCancel: CanClose := False;
    end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  case FReason of
     0: {сохранение не требуется} ;
     1: {завершение сессии} ;
     2: DoSaveData (..) ;
   end;
end;

Leonid Troyanovsky <lv.t@eco-pro.ru>

------------------------------------------------------------
Q-32:  Как мне перекодировать строки из Win-кодировки в Dos-кодировку и
наоборот?
------------------------------------------------------------
CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff.

1. if S <> '' then CharToOem(PChar(S),PChar(S));
2. CharToOem(Pointer(S),Pointer(S));

Примечания:

1. Не стоит вызывать эту функцию если S = '' будет ошибка, второй вариан не
имеет этой ошибки.

2. Заметьте однако, что эти функции не умеют делать таких, вещей, как koi8-r
в DOS и т. п.

3. Не стоит использовать эту функцию также для преобрахования из русской
кодировки DOS в русскую Windows и обратно, так как это не преобразование по
русскому алфавиту а перекодирова именно из DOS в Windows, то есть на основе
текущей локализации системы, если нужна абсоютная гарантия, то следует
вопользоваться перекодировкой по таблице, рекомендуется по полной таблице из
всех 256 символов, на моей странице (http://podgoretsky.com) есть
универсальная функция перекодировки (CharCvt) с набором некоторых основных
таблицю

------------------------------------------------------------
Q-33:  Кaк yзнaть кaкиe фyнкции нaхoдятcя в DLL и кaк их иcпoльзoвaть?
------------------------------------------------------------
Леонид Трояновский

  %delphi%\bin\tdump.exe
  MS Quick View

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

Если заголовок есть, он описывается в разделе implementation как external.
Обычно библиотеки используют соглашение stdcall.  (реже cdecl, дельфийские -
register).

------------------------------------------------------------
Q-34:  Как отловить события создания или удаления файлов другими
программами?
------------------------------------------------------------
В rxLib есть TrxFolderMonitor.

(Win16) FileCDR, но она плохо документирована.

------------------------------------------------------------
Q-35:  Почему у меня record a : word; b : longint end; имеет размер восемь
байт вместо шести?
------------------------------------------------------------
Если не использовать ключевое слово packed, то Дельфи производит
выравнивание структуры на определенную границу. В разных версиях Дельфи по
разному.

Для того что избежать этого, надо описать структуру следующим образом:

aRec = packed record
  a : Word;
  b : LongInt;
end;

Также не стоит использовать фундаментальные типы, так как их размерность
зависит от версии Дельфи.

------------------------------------------------------------
Q-36:  Не перерисовываются окна во время длинного цикла
------------------------------------------------------------
Моя программа довольно долго делает какую-то полезную работу, типа чтения
дерева каталогов или обильных вычислений, и в этот момент почти не работают
остальные программы. Как разрешить им это делать?

Application.ProcessMessages.

(AA): Если вы хотите отдавать timeslices в нитях, пользуйтесь Sleep(0); это
отдаст остаток слайса системе.

(Win16) Если вы хотите разрешить отработку сообщений другим программам, но
не вашей, то лучше пользоваться Yield().

------------------------------------------------------------
Q-37:  Как отследить "уход" курсора мыши с компоненты?
------------------------------------------------------------
Надо обрабатывать события CM_MOUSEENTER/CM_MOUSELEAVE.

------------------------------------------------------------
Q-38:  Как мне запустить какую-нибудь программу
------------------------------------------------------------
Как мне запустить какую-нибудь программу? А как подождать, пока эта
программа не отработает? Как выяснить, работает ли программа или уже
завершилась? Как принудительно закрыть выполняющуюся программу?

WinExec() или ShellExecute. Первая оставлена для совместимости с Win 3.1, у
второй к тому же больше возможностей.

uses
  ShellApi;

ShellExecute(Handle,'Open','c:\path\prog.exe',nil,nil,SW_SHOWNORMAL)

Последний параметр функции описан в Win32.hlp

Анатолий Подгорецкий
--------------------------

(SO): CreateProcess() в параметре process info возвращает handle запущенного
процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE);

(AA): (Win16) Delay можно взять из rxLib.

handle := WinExec(...);
if handle >= 32 then
  while GetModuleUsage(handle) > 0 do
    Delay( nn );
else
raise ....

(AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(),
параметр lpExitTime.

(Win32) Для принудительного завершения процесса -- TerminateProcess.

(Win16) (RR): Надо послать программе сообщение WM_QUIT:

Handle := Winexec(App, 0);
PostMessage(Handle, WM_QUIT, 0, 0);

------------------------------------------------------------
Q-39:  Как правильно закрыть и удалить форму?
------------------------------------------------------------
Как правильно закрыть и удалить форму? Почему моя MDI Child форма при
закрывании просто минимизируется?

Обрабатывайте событие OnClose для формы и выставляйте в нем параметр Action
в caFree. Дело в том, что его значение по умолчанию для MDI Child форм
caMinimize. Кстати, если сделать Action := caNone, то форму нельзя будет
закрыть.

------------------------------------------------------------
Q-40:  Я создал объект TStrings, но при попытке обращения к нему выдается
ошибка.
------------------------------------------------------------
TStrings -- это базовый класс. Вам нужен TStringList.

------------------------------------------------------------
Q-41:  Мне надо добавить много строк в TListbox или в TCombobox или в TMemo
------------------------------------------------------------
Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в
TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как
избавиться от этого?

BeginUpdate/EndUpdate.

------------------------------------------------------------
Q-42:  Как правильно создавать компоненты в run-time?
------------------------------------------------------------
Как правильно создавать компоненты в run-time? Что задавать в    качестве
параметра Owner при создании компоненты? Как обрабатывать    события от
созданных компонент, типа нажатий на кнопки?

Начнем с создания.

Сущность свойства Owner в том, что владелец перед смертью уничтожает (через
Free) принадлежащие ему объекты. Таким образом, все зависит от того, кому вы
хотите доверить уничтожение созданных форм/компонентов. В частности, если вы
сами будете этим заниматься, то AOwner может быть, например, nil.

Для того, чтобы созданный компонент появился на экране, надо указать его
родителя, заполнив свойство Parent, например,
NewButton.Parent := Form1;

Пример кода, обрабатывающего события от свежесозданных компонентов:

type
  TForm1 = class(TForm)
  { ... }
  private
    { эта процедура будет вызываться при нажатии на кнопку }
    procedure ButtonClicked(Sender : TObject);

  public
    { в этой процедуре происходит создание кнопки }
    procedure CreateButton;

  end;

{ ... }

procedure TForm1.CreateButton;
var
  btn : TButton;
begin
  btn := TButton.Create(Self);  // Уничтожать кнопку будет форма
  btn.Parent := Self;           // Родителем кнопки будет форма
  btn.OnClick := ButtonClicked; // Процедура, которая будет исполняться при
  btn.Visible := true;          // нажатии на кнопку
end;

------------------------------------------------------------
Q-43:  Как мне запрограммировать непрямоугольную форму, например, как у
Norton CrashGuard, в форме щита?
------------------------------------------------------------
SetWindowRgn() (Win32).

------------------------------------------------------------
Q-44:  Как использовать свои курсоры в программе?
------------------------------------------------------------
{$R CURSORS.RES}

const
  crZoomIn = 1;
  crZoomOut = 2;

Screen.Cursors[crZoomIn] := LoadCursor(hInstance, 'CURSOR_ZOOMIN');
Screen.Cursors[crZoomOut] := LoadCursor(hInstance, 'CURSOR_ZOOMOUT');

С вашей программой должен быть слинкован файл ресурсов, содержащий
соответствующие курсоры.

------------------------------------------------------------
Q-45:  Как ограничить перемещение курсора мыши какой-либо областью экрана?
------------------------------------------------------------
ClipCursor(). Учтите, что использование этой функции -- плохой тон.

------------------------------------------------------------
Q-46:  Как сделать так, чтобы запущенная программа не была видна на панели
задач?
------------------------------------------------------------
Во-первых, можно по примеру Back Orifice воспользоваться функцией
RegisterServiceProcess (только для Win9x).

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

(EM, DS):

type
  TForm1 = class(TForm)
    Label1: TLabel;
    RxTrayIcon1: TRxTrayIcon;
    procedure FormCreate(Sender : TObject);
    procedure RxTrayIcon1DblClick(Sender: TObject);
  private
    procedure ApplicationMinimize(Sender : TObject);
    procedure ApplicationRestore(Sender : TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMinimize := ApplicationMinimize;
  Application.OnRestore := ApplicationRestore;
  ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.ApplicationMinimize(Sender : TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.ApplicationRestore(Sender : TObject);
begin
  ShowWindow(Application.Handle, SW_RESTORE);
end;

procedure TForm1.RxTrayIcon1DblClick(Sender: TObject);
begin
  Application.Restore;
  Application.BringToFront;
end;

(AK):
Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к
тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose
выводится вопрос о подтверждении, то могут быть проблемы с автоматическим
завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT
не завершается. Очевидно, что сообщение выводится, но его не видно (причем
SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после
всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt.

------------------------------------------------------------
Q-47:  Как из программы переключить раскладку клавиатуры?
------------------------------------------------------------
ActivateKeyboardLayout(). Учтите, что использование этой функции -- плохой
тон.

------------------------------------------------------------
Q-48:  Как получить короткий путь файла если имеется длинный?
------------------------------------------------------------
GetShortPathName()

------------------------------------------------------------
Q-49:  String в PChar и обратно
------------------------------------------------------------
Для этого достаточно приведения

StringVar := String(PCharVar);
PCharVar := PChar(StringVar);

Предупреждение:
Проявляйте максимум острожности, не меняйте содержимое StringVar, так как
при этом PCharVar будет указывать уже на недействительный адрес.

------------------------------------------------------------
Q-50:  Как при наведении курсора на кнопку менять ее цвет?
------------------------------------------------------------
type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
  private
    procedure NewBtnWindowProc(var Msg:TMessage); // Это новый обработчик
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

var
  OldBtnWindowProc : TWndMethod;

procedure TForm1.NewBtnWindowProc;
begin
  case msg.Msg of
    CM_MOUSELEAVE: BitBtn1.Font.Color := clGray;
    CM_MOUSEENTER: BitBtn1.Font.Color := clBlack;
   end;
   OldBtnWindowProc(Msg);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   OldBtnWindowProc   := BitBtn1.WindowProc;
   BitBtn1.WindowProc := NewBtnWindowProc;
   BitBtn1.Perform(CM_MOUSELEAVE,0,0); // Изначально серый
end;

------------------------------------------------------------
Q-51:  Как написать сервис для Windows NT?
------------------------------------------------------------
В поставке Delphi 4 есть пример. http://www.sawatzki.de.

------------------------------------------------------------
Q-52:  Как работать с реестром?
------------------------------------------------------------
uses TRegistry

Begin
  with TRegistry.Create;
  try
    OpenKey('\Sotware\FirmName\ProgName\Version',True);
    WriteInteger('Count',Count);
  finally
    Free
  end;
end;

------------------------------------------------------------
Q-53:  Как выдвинуть дверцу CD-ROM'а?
------------------------------------------------------------
procedure EjectCDROM(aLetter : char);
const
  AliasName = 'MyCoolCdrom';
var s : string;
begin
   s := 'open ' + aLetter + ': type cdaudio alias ' + AliasName + aLetter +
' shareable wait';
   if mciSendString(PChar(s), nil, 0, 0) <> 0 then exit; // fails to open
   try
     s := 'set ' + AliasName + aLetter + ' door open wait';
     mciSendString(PChar(s), nil, 0, 0);
   finally
     s := 'close ' + AliasName + aLetter + ' wait';
     mciSendString(PChar(s), nil, 0, 0);
  end;
end;

------------------------------------------------------------
Q-54:  Как перехватывать клавиши, нажатые в окне другой программы? И вообще,
любые события
------------------------------------------------------------
SetWindowsHookEx().

------------------------------------------------------------
Q-55:  Как сделать индикатор прогресса для длительного запроса?
------------------------------------------------------------
Так как оценить объем запроса до его выполнения сложно, то совсем непросто
придумать (и сделать) что-то лучше, чем показать пользователю TAnimate.

Однако, чтобы показывать что-либо при большом запросе придется выполнять
запрос в потоке. См. пример %delphi%\demos\db\bkquery

------------------------------------------------------------
Q-56:  Как вызывать из 32-битной программы 16-битные DLL?
------------------------------------------------------------
Надо применять так называемые "thunks". Смотри статьи на
http://www.thedelphimagazine.com/samples/thunk/thunk95.htm

------------------------------------------------------------
Q-57:  Как получить набранный в Блокноте текст в свою пpогpаммку?
------------------------------------------------------------
function GetWindText(AHandle: THandle): String;
var
  cb : DWord;
begin
  cb := SendMessage(AHandle, WM_GETTEXTLENGTH, 0, 0);
  SetLength(Result, cb);
  if cb > 0 then
    SendMessage(AHandle, WM_GETTEXT, cb+1, LParam(@Result[1]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  AHandle: THandle;
begin
  AHandle := FindWindow('Notepad', nil);
  Win32Check(AHandle <> 0);
  AHandle := FindWindowEx(AHandle, 0, 'Edit', nil);
  Win32Check(AHandle <> 0);
  Memo1.Text := GetWindText(AHandle);
end;

------------------------------------------------------------
Q-58:  Как скопировать экран в буфер обмена?
------------------------------------------------------------
keybd_event(VK_SNAPSHOT, MapVirtualKey(VK_SNAPSHOT, 0), 0, 0);
keybd_event(VK_SNAPSHOT, 0, 0, 0);

------------------------------------------------------------
Q-59:  Где взять подробную документацию по работе с RTF, TRichEdit?
------------------------------------------------------------
В MSDN.

В rxLib 2.60 появился компонент TrxRichEdit, полностью поддерживающий MS
RichEdit 2.0 и его DB-aware версия. Рекомендуется.

------------------------------------------------------------
Q-60:  Как показать Hint для MenuItem?
------------------------------------------------------------
Нint, назначенный Item, можно показать в Statusbar:

procedure TForm1.AppHint(Sender: TObject);
begin
  StatusBar1.SimpleText := Application.Hint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnHint := AppHint;
end;

------------------------------------------------------------
Q-61:  Как можно перетаскивать форму не только за заголовок?
------------------------------------------------------------
type
  TForm = class(TForm)
  private
    procedure NCHitTest(var WMNCMsg: TWMNCHitTest); message WM_NCHITTEST;
  end;
....
procedure TForm1.NCHitTest(var WMNCMsg: TWMNCHitTest);
begin
  inherited;
  with WMNCMsg do if Result = HTClient then Result:= HTCaption;
end;

Ilya Katargin <Ilya.Katargin@f9.n5029.z2.fidonet.org>
----------------------------------------------------------------------------

Ещё один метод пеpетаскивания фоpмы не только за заголовок, а
вообще за любой компонент, коду значительно меньше, и он пpоще.

procedure TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton;
                                 Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform (WM_SYSCOMMAND,SC_MOVE+2,0);
end;

Этот кусочек соpца надо подцеплять в обpаботчик OnMouseDown контpола, за
котоpый будем таскать.

GauSS aka Gusev Andrey.

------------------------------------------------------------
Q-62:  Как сделать прозрачным фон при выводе Canvas.TextOut?
------------------------------------------------------------
Canvas.Brush.Style := bsClear;

------------------------------------------------------------
Q-63:  Как применить изменение в реестре без перезагрузки компьютера?
------------------------------------------------------------
Многие программы могут откликнуться на:

  SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, ..)   в Win9х
  SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ..) в NT

------------------------------------------------------------
Q-64:  Как добавить пункты в системное меню окна?
------------------------------------------------------------
Получить хэндл системного меню окна можно с помощью функции GetSystemMenu().

------------------------------------------------------------
Q-65:  Как в Мемо установить карет в нyжнyю позицию?
------------------------------------------------------------
with Memo do
  SelStart := Perform(EM_LINEINDEX, LineIndex, 0) + CharIndex;

PS: карет - это специальный указатель позиции ввода следующего символа, не
путать с курсором мышки.

------------------------------------------------------------
Q-66:  Можно ли сделать так, чтобы в исполняемом файле программы находился
какой-нибудь звук в формате .wav
------------------------------------------------------------
Можно ли сделать так, чтобы в исполняемом файле программы находился
какой-нибудь звук в формате .wav, и можно было бы проиграть этот звук?

В файл MyWave.rc пишешь:

MyWave RCDATA LOADONCALL MyWave.wav
brcc32.exe MyWave.rc, получаешь MyWave.res.

В своей программе пишешь:

{$R MyWave.res}

Все!

Предупреждая следующий твой вопрос "а как прочитать wave-файл из
исполняемого файла?"

procedure RetrieveMyWave;
var
  hResource: THandle;
  pData: Pointer;
begin
  hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave',
RT_RCDA
TA));
  try
    pData := LockResource(hResource);
    if pData = nil then
      raise Exception.Create('Cannot read MyWave');
    // Здесь pData указывает на MyWave
    // Теперь можно, например, проиграть его (Win32):
    PlaySound(pData, 0, SND_MEMORY);
  finally
    FreeResource(hResource);
  end;
end;
+++++++++++++++++++++++++++++++++

PlaySound('RESNAME', 0, SND_MEMORY or SND_RESOURCE);

Для этого надо создать файл описания ресурса, например Waves, в который
поместить следующие строки:

SOUND1   WAVE  WMyWave1.wav
SOUND2   WAVE  WMyWave2.wav

Затем запустить ресурс на компилияцию brcc32.exe Waves.rc, в результате
получится файл ресурса Waves.res.
В своей программе подключаем ресурс (в любом модуле):

{$R Waves.res}

Для проигрывания звука можно использольвать функцию PlaySound

PlaySound('SOUND1', 0, SND_ASYNC or SND_RESOURCE);
Anatoly Podgoretsky
+++++++++++++++++++++++++++++++++++++++++

если Delphi 5, то можно .rc прямо в проект включать
Олег Степанов:

------------------------------------------------------------
Q-67:  Как сделать в меню список последних открытых файлов?
------------------------------------------------------------
Пусть список файлов хранится в FileList : TStringList, a mmReopen :
TMenuItem - пункт меню, содержащий ссылки на файлы, тогда при изменениии
списка файлов надо сделать:

  {var NewItem: TMenuItem}

  for I := mmReopen.Count -1 downto 0 do
  begin
    mmReopen.Delete(I);
  end;

  for I := 0 to lf.Count-1 do
  begin
    NewItem         := TMenuItem.Create(mmReopen);
    NewItem.Caption := '&'+IntToStr(I) + ' ' + FileList.Strings[I];
    NewItem.OnClick := FileOpenProc;
    mmReopen.Add(NewItem);
  end;
  ...
  procedure FormX.FileOpenProc(Sender : TObject);
  var
    Filename : String;
  begin
    Filename := FileList.Strings[mmReopen.IndexOf(TMenuItem(Sender))];
    ...
  end;

  ------------------------------------------------------------
Q-68:  Как узнать и поменять разрешение экрана?
------------------------------------------------------------
Поменять:

procedure ChangeDisplayResolution(x, y : word);
var
  dm : TDEVMODE;
begin
  ZeroMemory(@dm, sizeof(TDEVMODE));
  dm.dmSize := sizeof(TDEVMODE);
  dm.dmPelsWidth := x;
  dm.dmPelsHeight := y;
  dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
  ChangeDisplaySettings(dm, 0);
end;

Узнать можно также с помощью объекта Screen

Screen.Width
Screen.Height

------------------------------------------------------------
Q-69:  Какое событие происходит при минимизации окна?
------------------------------------------------------------
OnResize
Для MainForm : Application.OnMinimize

------------------------------------------------------------
Q-70:  Как во время выполнения программы создать так называемый "array of
const"
------------------------------------------------------------
В библиотеке Technical Information на сайте Inprise есть документ за нумером
TI582D.txt, посвященный этой проблеме. Вкратце, в качестве array of const
можно использовать массив типа TVarRec.

------------------------------------------------------------
Q-71:  Как сохранить в ini файле настройки TFont?
------------------------------------------------------------
uses
  IniFiles;

procedure TForm1.Button1Click(Sender: TObject);
var
  IniFile : TIniFile;
begin
  IniFile := TIniFile.Create('myIni.ini');
  with Edit1.Font do with IniFile do begin
    Name    := ReadString ('Font','Name','MS Mans Serif');
    Charset := ReadInteger('Font','Charset',RUSSIAN_CHARSET);
    Color   := ReadInteger('Font','Color', clWindowText);
    Height  := ReadInteger('Font','Height',-11);
    Size    := ReadInteger('Font','Size',8);
    Style   := TFontStyles(Byte(ReadInteger('Font','Style',0)));
  end;
  IniFile.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  IniFile : TIniFile;
begin
  IniFile := TIniFile.Create('myIni.ini');
  with Edit1.Font do with IniFile do begin;
    WriteString ('Font','Name', Name);
    WriteInteger('Font','Charset', Charset);
    WriteInteger('Font','Color', Color);
    WriteInteger('Font','Height', Height);
    WriteInteger('Font','Size', Size);
    WriteInteger('Font','Style',Byte(Style));
  end;
  IniFile.Free;
end;

------------------------------------------------------------
Q-72:  Как обратиться к определенному адресу физической памяти?
------------------------------------------------------------
Как обратиться к определенному адресу физической памяти? А как прочитать
значение из порта? Где мой любимый массив Port[]?

Прочитайте какую-нибудь книжку про программирование под Win32. Вкратце --
забудьте про все эти глупости.

P.S. Q155 содержит несколько методов работы с портами, как легальных, так и
не вполне. В статье также содержится несколько ссылок на наиболее известные
драйвера.

------------------------------------------------------------
Q-73:  Как закрыть внешнюю программу?
------------------------------------------------------------
Например, Блокнот можно закрыть так:

procedure TForm1.Button1Click(Sender: TObject);
var
  phandle : HWND;
begin
  phandle := FindWindow('Notepad', nil);
  if phandle = 0 then
     RaiseLastWin32Error;
  SendMessage(phandle, WM_CLOSE, 0, 0);
end;

------------------------------------------------------------
Q-74:  Как загрузить из ImageList иконку приложения?
------------------------------------------------------------
ImageList1.GetIcon(Idx, Application.Icon);

------------------------------------------------------------
Q-75:  Как использовать в качестве обработчика сообщения обычную процедуру,
а не метод объекта?
------------------------------------------------------------
У этой процедуры должен быть еще один дополнительный параметр.
В метод класса кpоме паpаметpов, обьявленных в заголовке, пеpедаётся  ещё
паpаметp Self

procedure MyRegularProc(ASelf, Sender: TObject);
begin
  ShowMessage(ASelf.ClassName + ' ' + Sender.ClassName);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  amethod: TMethod;
begin
  amethod.Code := @MyRegularProc;
  amethod.Data := Self;
  Button1.OnClick := TNotifyEvent(amethod);
end;

Leonid Troyanovsky <lv.t@eco-pro.ru>

------------------------------------------------------------
Q-76:  Как отловить нажатие Enter в TEdit?
------------------------------------------------------------
IMHO, чтобы сделать в духе Windows, то добавь к Edit один TButton, с
свойством default := True, обработчик OnClick которой будет делать нужную
работу.

Другие варианты, чреваты тем, что может сработать не то, что ожидается.

Вот последовательность как будут вызываться обработчики при нажатии Enter
  1. OnClick кнопки default
  2. OnClick формы, если у нее KeyPreview := True;
  3. OnKeyDown/KeyPress/KeyUp контрола имеющего фокус ввода.

Это особенность роли, которую этой клавише обычно назначают в win
приложениях. Обрати также внимание на свойство TButton Cancel - оно
заставляет срабатывать кнопку при нажатии Esc

Для того чтобы разобраться в этих моментах попробуй неколько вариантов,
снимая комментарии:

  procedure TForm1.Button1Click(Sender: TObject);
  begin
    //Button1.Default := True;
    ShowMessage('Key1');
  end;

  procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
  begin
    //KeyPreview := True;
    if Key = #13 then
      begin
        ShowMessage('Key2');
        Key := #0;
      end;
  end;

  procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  begin
   if key = #13 then
      ShowMessage('Key3');
  end;

------------------------------------------------------------
Q-77:  В какой позиции Memo находится каретка?
------------------------------------------------------------
var
  LineNum, Charnum: Integer;
....

  LineNum := Memo1.Perform(EM_LINEFROMCHAR, -1, 0);
  CharNum := Memo1.Perform(EM_LINEINDEX, LineNum, 0);

------------------------------------------------------------
Q-78:  Как работать с графическими форматами, хотя бы самыми известными?
------------------------------------------------------------
На [32]http://www.imagelib.com лежит библиотека ImageLib.

На компакте с Delphi 3 в каталоге EXTRAS есть библиотека JPEG. Если сказать
в модуле uses jpeg; то можно работать с .jpg как с TPicture.

Еще есть freeware-библиотека Nishita ViewLib. JPG, JFIF, GIF, BMP, DIB, RLE,
TGA, PCX. http://einstein.ae.eng.ua.edu/nishita/index.htm.

------------------------------------------------------------
Q-79:  Почему после RichEdit1.Lines.SaveToFile(name) в файле, кроме моего
текста, ещё всякий бред написан?
------------------------------------------------------------
Таким образом в RTF сохраняется информация об оформлении текста. Если
сохранять нужно только текст, перед записью сделай

  RichEdit1.PlainText := True;

------------------------------------------------------------
Q-80:  Как работать с файлами архивов, хотя бы самыми распространенными?
------------------------------------------------------------
Воспользуйтесь библиотекой ExceedZip 3.0 (http://www.exceedsoft.com).

------------------------------------------------------------
Q-81:  Как вставить картинку в TDrawGrid?

Секция 2 из 5 - Предыдущая - Следующая

Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru