faqs.org.ru

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

RU.DELPHI.CHAINIK FAQ

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

From: "Anatoly Podgoretsky" <anatoly@podgoretsky.com>
Date: Sat, 4 May 2002 16:26:32 +0000 (UTC)
Subj: fido7.ru.delphi.chainik FAQ

------------------------------------------------------------
I-1:  Версия от 27.04.2002
------------------------------------------------------------
Конференция: fido7.ru.delphi.chainik.


------------------------------------------------------------
I-2:  Введение
------------------------------------------------------------
FAQ для конференции fido.ru.delphi.chainik, основано на вопросах в данной
конференции.


------------------------------------------------------------
I-3:  Авторские права
------------------------------------------------------------
Copyright (C) Anatoly Podgoretsky, 2001


------------------------------------------------------------
I-4:  Преамбула
------------------------------------------------------------
Пожалуйста, не задавайте вопросы в этой конференции, до того, как прочтете
этот документ, правила конференции, ознакомитесь со списком рекомендованной
литературы и проведете самостоятельные исследования вопроса. Желательно
также ознакомиться с архивом конференции за два-три последних месяца.
Это поможет всем вам сохранить конференцию интересной и полезной.

------------------------------------------------------------
I-5:  О поле Subject:
------------------------------------------------------------
Правилами конференции, в частности, регламентируется содержание поля
Subject: ваших писем. Дело в том, что многие из тех, кто мог вы вам помочь,
читают эхи методом "по сабджектам", сознательно не тратя время на письма под
заголовком "Help!", "Проблема" или "Вопрос чайника". Подумайте об этом.

Отсутствие же заголовка вообще дезоринентирует остальных подписчиков
конференции и потому считается явным неуважением к ним и может вызвать
ядовитый вопрос "ТЫ МЕНЯ УВАЖАЕШЬ". На какой ответ может расчитывать тот,
кто даже поленился сформулировать свой вопрос.



------------------------------------------------------------
I-6:  Здесь не приветствуется
------------------------------------------------------------
* общая неспособность получать информацию из окружающей реальности. Прочтите
книгу об эффективной коммуникации и должном отношении ко всему.

* не уважительное отношение к участникам конференции. Как правило это в
основном люди делающие свои первые шаги в программировании.

* Ответы типа RTFM, рекомендуется приводить небольшой кусок кода
демонстрирующий решение проблемы. В случае же ссылки на хелп, желательно
указывать название темы.

------------------------------------------------------------
I-7:  Доступность этого FAQ
------------------------------------------------------------
Этот документ регулярно изменяется по результатам обсуждения в конференции.
Вы можете поучаствовать в составлении документа, прислав по адресу
faq@podgoretsky.com сформулированный вариант вопроса, ответ или дополнение
или исправление к ответу. Большие куски кода неуместны в FAQ. В любом
случае, вы можете обратиться к авторам сопутствующих проектов, список
которых приведен ниже.

Разрешается свободное распространение и использование этого документа при
соблюдении определенной вежливости по отношению к автору и читателям,
основной составляющей чего является соблюдение целостности документа. Не
очень приветствуется выкладывание копий этого документа на WWW: подумайте,
нужны ли вам непрерывные усилия по синхронизации?

Если же вы вынуждены использовать этот документ на сайте, для того, чтобы
создать его содержимое, подумайте, нужен ли вообще ваш сайт?

Свежая версия этого документа находится на домашней странице автора
http://www.podgoretsky.com (доступен движок FaqMaker.exe с его исходными
тексты и последними версиями баз).
Альтернативный источник http://faq.delphiplus.org - более быстрый канал,
плюс FAQ доступен не только в dBase формате, но и в HTML формате.

Остерегайтесь подделок.


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

Список литературы на все интересующие темы, рекомендованный к прочтению,
находится в неофициальном FAQ. эхоконференции RU.BOOKS.COMPUTING. Свежие
версии этого FAQ. регулярно публикуются в соответствующей эхоконференции, а
также доступны на домашней странице автора.

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

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

Само собой, хотелось бы увидеть у активного участника конференции
определенные знания языка программирования Object Pascal, являющегося
основой Delphi, а также знаний в области программирования вообще,
программирования под Windows в частности, а также предметной области своей
собственной задачи. Без всякого сомнения, вы можете общаться и задавать
вопросы на любом уровне, но ожидайте соответствующей реакции извне.

Научитесь также пользоваться системой помощи, поставляемой вместе с Delphi.
Как это ни прискорбно, весьма ощутимый процент задаваемых в эхе вопросов
легко снимается нажатием кнопки F1 и поиском примерного перевода вопроса на
английский язык. Примером тому может являться сакраментальный вопрос о
получении короткого имени файла из длинного и ответ: GetShortPathName. Да,
скорее всего вам придется восполнить свои пробелы в школьном образовании и
изучить некоторое подмножество английского языка, без коего вы имеете не
столь много шансов успешно функционировать в выбранной области.

Учтите наличие в поставке Delphi большого количества разнообразных примеров.
Возможно, ознакомившись с ними, вы приобретете дополнительные знания.
Изучите исходные тексты Visual Component Library, поставляемой вместе с
Delphi Professional и Delphi Client/Server, а также хорошие образцы
кодирования и проектирования, например, исходники rxLib.
Кроме того исходные тексты дельфи являются не только пособием по VCL, но и
2-3 килограмма легкоусвояемого WinAPI.

По мере освоения Дельфи, возможно, вам следует приобрести тем или иным
способом ту часть Microsoft Developer Network (MSDN), что содержит в себе
документацию. Это диски с названиями "Platform SDK", "Additional SDKs and
Tools" и "DDKs". В них содержится более свежая, более полная и обширная
информация по всем аспектам программирования под Windows. Подписка на эту
часть MSDN (это первый уровень) стоит не столь дорого и вы имеете все шансы
купить ее, например, для своей организации. Более того, на
http://msdn.microsoft.com можно получить доступ к львиной доле документации
из MSDN.

Традиционно обитатели RU.DELPHI питают заслуженную любовь и уважение к
библиотеке rxLib. Это большая библиотека компонент для Delphi всех версий и
C++Builder, распространяемая по системе freeware с полными исходными
текстами и файлами помощи на русском языке. Выяснено, что эта библиотека
способна покрыть очень большое количество запросов программистов на Delphi
самого разного уровня, и в частности, именно на нее будут даваться обильные
ссылки далее по тексту. Дополнительную информацию вы можете получить по
адресу http://www.rxlib.com.

По возможности фидошные обитатели RU.DELPHI помещают интересные файлы в так
называемые файлэхи. Официальной файлэхой RU.DELPHI является WDEVDELPHI.
Ценным ресурсом являются файлэхи группы FED* (модератор -- Акжан Абдулин,
2:5040/55). Если вы читаете RU.DELPHI из Фидо, то подпишитесь на эти файлэхи
и научитесь пользоваться файловыми запросами (FReq'ами), так как многие узлы
хранят файлы, проходившие по
 файлэхам, в течение довольно долгого времени. Обратитесь к вашему боссу в
случае затруднений. Если же вы из Интернета, то поисковые машины, такие как
http://www.altavista.com, http://ftpsearch.lycos.com, а также крупнейший
архив ньюсгрупп http://www.dejanews.com, станут вашими лучшими помощниками.
Вам следует также заметить, что существует определенное количество
FTP-архивов, содержащих вышеупомянутые файлэхи, например, ftp://bbs.ogo.ru.

Само собой, Интернет переполнен ресурсами, посвященными Borland Delphi. Для
начала хороший список ссылок можно найти на официальной странице rxLib:
http://www.rxlib.com.
В данный момент проект закрыт и источники получения весьма неопределены.
Подробности в статье по RxLib из FAQ конференции ru.delphi

Приведенные источники со временем могут пропадать, это судьба всех проектов.

------------------------------------------------------------
Q-9:  Каким именно релизом Delphi вообще стоит пользоваться для каждой
конкретной версии?
------------------------------------------------------------
Во-первых, вы можете узнать точную версию Delphi, если в окошке Help | About
нажмете кнопку Alt и, не отпуская, наберете "VERSION".

Delphi 1 следует апгрейдить до версии 1.02 с помощью патчей.

Delphi 2 следует апгрейдить до версии 2.01. Это полноценный дистрибутив. Эту
версию можно, в частности, узнать по странице "Internet" в палитре
компонентов. Ее точная версия  2.0.76.0.

Delphi 3 следует взять версии 3.02. Это полноценный дистрибутив 3.01 и патчи
до 3.02.

Delphi 4 же должна быть обновлена вторым, а затем третьим Service Pack'ами,
которые можно взять на сайте Inprise.
Версии Delphi 4.3 и 4.5 являются обманными версиями. В действительности это
ранние беты Delphi 4.0.

Delphi 5 же должна быть обновлена первым и вторым (обновление справочной
системы) Service Pack'ами, которые можно взять на сайте Inprise.
Версия Delphi 5.5 также является обманной версией.


------------------------------------------------------------
Q-10:  Delphi 2 и 3 не отображают русские TTF под Windows NT WorkStation +
ServicePack#3
------------------------------------------------------------
(AlPe): Попробуй сделать в

[HKLM\Software\Microsoft\Windows NT\CurrentVersion\FontMapper]
DEFAULT=0xcc (204) вместо 0x00 (Именно DEFAULT, а не (Default) :-)

получше маленько будет...


------------------------------------------------------------
Q-11:  Как установить компонент от Delphi одной версии под Delphi другой
версии, если имеется только .DCU
------------------------------------------------------------
Никак. Фирма Borland всегда поддерживала несовместимость .DCU-файлов между
разными версиями. Ищите исходник или .DCU, скомпилированный для
соответствующей версии Delphi.


------------------------------------------------------------
Q-12:  Delphi 4 виснут при запуске. Видеокарта S3 Virge.
------------------------------------------------------------
REGEDIT4
[HKEY_CURRENT_CONFIG\Display\Settings]
"BusThrottle"="on"

Если не помогает, то попробуйте добавить в system.ini:

[Display]
"BusThrottle"="On"

Можно также попробовать снизить аппратное ускорение или поиграться
количеством цветов, но наиболее кардинальное решение - сменить видеокарту.

------------------------------------------------------------
Q-13:  Можно ли скомпилировать на Delphi 2/3/4 программу, работающую под
Windows 3.1?
------------------------------------------------------------
NP): Нет, но в дистрибутиве с Delphi 2/3/4 поставляется Delphi 1 специально
для этой цели.


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

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


------------------------------------------------------------
Q-15:  Как мне перекодировать строки из Win-кодировки в Dos-кодировку и
наоборот?
------------------------------------------------------------
CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти
функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п.


------------------------------------------------------------
Q-16:  Как вывести диалог выбора каталога?
------------------------------------------------------------
(DS): SelectDirectory, rxLib: TDirectoryEdit.

Из современных средств SHBrowseForFolder

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

Application.ProcessMessages.


------------------------------------------------------------
Q-18:  Как мне запустить какую-нибудь программу
------------------------------------------------------------
WinExec() или ShellExecute. Первая оставлена для совместимости с Win 3.1, у
второй к тому же больше возможностей.

uses
  ShellApi;

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

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

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



------------------------------------------------------------
Q-19:  Как сделать так, чтобы при щелчке по кнопке или по TLabel запускался
браузер
------------------------------------------------------------
uses
  ShellApi;

В обработчике OnClick метки или клавиши ввести следующий код.

ShellExecute(Handle,'open','http://faq.delphiplus.org',nil,nil,SW_SHOWNORMAL
);


------------------------------------------------------------
Q-20:  Как сделать так, чтобы при щелчке по кнопке или по TLabel отправить
письмо
------------------------------------------------------------
В разделе uses
  ShellAPI.

В обработчике OnClick метки или клавиши ввести следующий код.

ShellExecute(Handle,'open','mailto:lalala@lala.ru',nil,nil,SW_SHOWNORMAL);


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

const
  crZoomIn = 1;
  crZoomOut = 2;

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

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


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

unit ComVars;

interface

var
  MyVar : Integer

implementation
end.

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

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


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

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

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

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



------------------------------------------------------------
Q-24:  Как сделать так, чтобы по 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-25:  К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-26:  Как выдвинуть дверцу CD-ROM'а?
------------------------------------------------------------
mciSendString('Set cdaudio Door Open Wait', nil, 0, handle);


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

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

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

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

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


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

Для этого надо создать файл описания ресурса, например 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);



Олег Степанов:

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



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


------------------------------------------------------------
Q-31:  Где достать процедуру типа "сумма прописью"?
------------------------------------------------------------
(Vladimir Gaitanoff, 2:5020/880.5), http://www.tsinet.ru/~vg. Здесь лежит
библиотека vgLib, содержащая еще массу полезных вещей.


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

В rxLib есть компонент TrxMathParser, достаточно мощный для большого
количества применений.


------------------------------------------------------------
Q-33:  Где достать всяких иконок, картинок для кнопок, etc. для своей
программы?
------------------------------------------------------------
http://www.iconbazaar.com


------------------------------------------------------------
Q-34:  Как правильно создавать компоненты в 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-35:  Как сделать так, чтобы запущенная программа не была видна на панели
задач?
------------------------------------------------------------
Во-первых, можно по примеру 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-36:  Delphi 5.0 and Win2K
------------------------------------------------------------
--- Vladimir Kladov <bonanzas@online.sinor.ru>

1. Если кто не читает readme-файлы до начала установки, то с интересом
узнает, что в сопроводиловке от Борланд указывается на проблему неправильной
работы инсталлятора, если используются кнопки Browse для смены каталогов
установки. При этом рекомендуется набрать/подредактировать пути вручную. (Не
проверял, просто действовал
как рекомендовано, хотя пути по умолчанию никогда не использую).

2. При установке с жесткого диска, весь дистрибутив вместе с папками
Runimage и Install надо либо поместить в корень логического диска (что
обычно неудобно), либо используя subst (или в сети - use net), сотворить
букву для этого пути. Чтобы инсталлятор решил, что установка идет из корня
диска. Иначе - облом-с.

3. При установке на машину, на которой предполагается наличие нескольких
программеров, работающих посменно, сначала придется поставить из-под
админа - для всех. А потом - из-под каждого аккаунта (хотя бы в режиме
Registry + Custom). Иначе не будет компонентов на палитре.

4. Проверить переменные среды %TEMP% и %TMP%, рекомендуется короткий путь -
C:\TEMP

5. Первичная установка под административным аккаунтом с АНГЛИЙСКИМ именем,
например admin

--- Ruslan Fedoseev <Ruslan.Fedoseev@hell.avugu.lg.ua>

Можно экспоpтиpовать y админа HKEY_CURRENT_USER/Software/Borland и пpосто
импоpтиpовать для каждого потом. Так несколько быстpее, чем инсталиpовать и
уменьшается количество ошибок.



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

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

------------------------------------------------------------
Q-38:  Как сделать печать формы из Дельфи?
------------------------------------------------------------
Form.Print

------------------------------------------------------------
Q-39:  Где можно найти список с пpимеpов из каталога DEMOS?
------------------------------------------------------------
Часть примеров кратко описана в delphiX.hlp в разделе What's new.

Также, можно заглянуть в readme.txt из директории Delphi.

При поиске интересующего примера, можно воспользоваться (прямо из D)
Search-Find in files и искать слова в директории+субдир Demos.

------------------------------------------------------------
Q-40:  Как при наведении курсора на кнопку менять ее цвет?
------------------------------------------------------------
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-41:  Как нажать кнопку в чужой программе?
------------------------------------------------------------
Так можно нажать на кнопку OK диалога "About Notepad":

  h1 {:HWND} := FindWindow(nil, 'About Notepad');
  h2 {:HWND} := FindWindowEx(h1, 0, 'BUTTON','OK');
  SendMessage(h2, BM_CLICK,0,0);
  SendMessage(h2, BM_CLICK,0,0); // если Notepad был неактивен


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

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



------------------------------------------------------------
Q-43:  Как получить набранный в Блокноте текст в свою п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-44:  Как скопировать экран в буфер обмена?
------------------------------------------------------------
keybd_event(VK_SNAPSHOT, 0, 0, 0);


------------------------------------------------------------
Q-45:  Как показать 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-46:  Как сделать прозрачным фон при выводе Canvas.TextOut?
------------------------------------------------------------
Canvas.Brush.Style := bsClear;


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

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


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

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

------------------------------------------------------------
Q-49:  Как сделать в меню список последних открытых файлов?
------------------------------------------------------------
Пусть список файлов хранится в 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;


------------------------------------------------------------

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

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

© faqs.org.ru