Здравствуйте, гость ( Вход | Регистрация )



Гостевой доступ к форуму из Москвы: Телефоны: +7(495)7859696,7376201,7376233,7868796,7390241 Login: demo Password: demo
3 страниц V  1 2 3 >  
Тема закрытаСоздать новую тему
> Delphi - Советы начинающим, Выкладивайте сюда свои советы и трюки
Mr.Floppy
сообщение Jun 29 2005, 00:29
Сообщение #1


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Выкладивайте сюда свои советы и трюки
Не флудить!


--------------------
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:30
Сообщение #2


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как выдать текст под наклоном?
Чтобы вывести под любым углом текст необходимо использовать TrueType Fonts (например "Arial"). Например:
CODE
var
 LogFont : TLogFont;

...
 GetObject(Canvas.Font.Handle, SizeOf(TLogFont), @LogFont);
 { Вывести текст 1/10 градуса против часовой стрелки }
 LogFont.lfEscapement := Angle*10;
 Canvas.Font.Handle := CreateFontIndirect(LogFont);
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:32
Сообщение #3


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как закрыть окно подсказки если пользователь закончил приложение?
В следующем примере показано как закрыть окно помощи если пользователь закончил приложение.
CODE
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Winhelp(Handle, 'WINHELP.HLP', HELP_QUIT, 0);
 Action := caFree;
end;
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:38
Сообщение #4


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как через индекс обратиться к нескольким компонентам?
Чтобы найти и сделать видимыми, например, компоненты с именами от "Label1" и до "Label5" можно использовать следующий вариант:
CODE
for t := 1 to 5 do
 FindComponent('Label' + IntToStr(t)).Visible := TRUE;
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:38
Сообщение #5


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как копировать и вставлять Bitmap через буфер обмена?
Некоторые функции для копирования и вставки Bitmap-объектов через буфер обмена.
CODE
function CopyClipToBuf(DC: HDC; Left, Top,
          Width, Height: Integer;  Rop: LongInt;
          var CopyDC: HDC;
          var CopyBitmap: HBitmap): Boolean;

var
 TempBitmap: HBitmap;

begin
 Result := False;
 CopyDC := 0;
 CopyBitmap := 0;
 if DC <> 0 then
   begin
     CopyDC := CreateCompatibleDC(DC);
     if CopyDC <> 0 then
       begin
         CopyBitmap := CreateCompatibleBitmap(DC,
                         Width, Height);
         if CopyBitmap <> 0 then
           begin
             TempBitmap := CopyBitmap;
             CopyBitmap := SelectObject(CopyDC,
                             CopyBitmap);
             Result := BitBlt(CopyDC, 0, 0,
                         Width, Height, DC,
                         Left, Top, Rop);
             CopyBitmap := TempBitmap;
           end;
       end;
   end;
end;

function CopyBufToClip(DC: HDC; var CopyDC: HDC;
          var CopyBitmap: HBitmap;
          Left, Top, Width, Height: Integer;
          Rop: LongInt; DeleteObjects: Boolean): Boolean;

var
 TempBitmap: HBitmap;

begin
 Result := False;
 if (DC <> 0) and
    (CopyDC <> 0) and
    (CopyBitmap <> 0) then
   begin
     TempBitmap := CopyBitmap;
     CopyBitmap := SelectObject(DC, CopyBitmap);
     Result := BitBlt(DC, Left, Top,
                 Width, Height, CopyDC,
                 0, 0, Rop);
     CopyBitmap := TempBitmap;
     if DeleteObjects then
       begin
         DeleteDC(CopyDC);
         DeleteObject(CopyBitmap);
       end;
   end;
end;[CODE]

[B]Как выяснить положение курсора в МЕМО?[/B]
Необходимо вызвать дважды API-функцию "SendMessage":
[CODE]var
 xChr,
 xRow,
 xCol: LongInt;
...

xRow := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);
xChr := SendMessage(Memo1.Handle, EM_LINEINDEX, Zeile, 0);
xCol := Memo1.SelStart - xChr + 1;
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:39
Сообщение #6


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как создать и использовать новую форму курсора?
Для этого необходимо создать новый курсор(ы) в подходящем для этого редакторе ресурсов (например борландовский Resource Workshop). При этом надо обратить внимание на то что имена в редакторе ресурсов (особенно в том, который поставляется с Delphi) надо писать заглавными буквами. После этого "перед внутренним употреблением" (лучше всего в процедуре обработки события OnCreate главной формы) необходимо загрузить курсор(ы) из res-файла как указано ниже:
CODE
{$I CURSOR.RES}

Screen.Cursors[1] := LoadCursor(hInstance, 'CURSOR_1');
Button1.Cursor := 1;

Обратите внимание на то, что системные курсоры в Screen.Cursors начинаются с нуля и идут в минусовом направлении. Поэтому при создании новых курсоров лучше выбирать положительные числа (лучше не слишком большие :-)).
Более удобный вариант - это объявить постоянную (равную например 12):
CODE
const
  CUR_HAND = 12;

...

Screen.Cursors[CUR_HAND] := LoadCursor(hInstance, 'CURSOR_HAND');
Button1.Cursor := CUR_HAND;
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:39
Сообщение #7


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как выяснить дату последнего изменения файла?
Для выяснения даты последнего изменения файла можно воспользоваться следующей функцией:
CODE
function GetFileDate(FileName: string): string;

var
 FHandle: Integer;

begin
 FHandle := FileOpen(FileName, 0);
 try
   Result := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));
 finally
   FileClose(FHandle);
 end;
end;
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:39
Сообщение #8


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как узнать, находится ли дискета в дисководе?
CODE
type
 TDriveState(DS_NO_DISK, DS_UNFORMATTED_DISK,
   DS_EMPTY_DISK, DS_DISK_WITH_FILES);

function DriveState(DrvLetter: Char): TDriveState;

var
 Mask: String[6];
 SearchRec: TSearchRec;
 oldMode: Cardinal;
 ReturnCode: Integer;

begin
 oldMode: = SetErrorMode(SEM_FAILCRITICALERRORS);
 Mask:= '?:\*.*';
 Mask[1] := DrvLetter;
 {$I-}  { отключить обработку исключительных ситуаций }
 ReturnCode := FindFirst(Mask, faAnyfile, SearchRec);
 FindClose(SearchRec);

 {$I+}
 case ReturnCode of
   { как минимум один файл был найден }
   0: Result := DS_DISK_WITH_FILES;
   { файлов не найдено и дискета в порядке }
   -18: Result := DS_EMPTY_DISK;
   { DS_NO_DISK для DOS, ERROR_NOT_READY для WinNT, ERROR_PATH_NOT_FOUND для Win 3.1 }
   -21, -3: Result := DS_NO_DISK;
 else
   { дискета лежит в дисководе но она не форматировнная }
   Result := DS_UNFORMATTED_DISK;
 end;
 SetErrorMode(oldMode);
end; { DriveState }
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:39
Сообщение #9


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как выводить форму в центр экрана?
Часто встречающийся вопрос начинающего программиста. Чтобы вывести форму в центре экрана необходимо (в самом простом случае) изменить свойство формы Position. Значение должно быть установленно в poScreenCenter. Причем это можно делать как в Object Inspector, так и во время работы программы. Пример:
CODE
Form1.Position := poScreenCenter;
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:39
Сообщение #10


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Порядок, в котором обрабатываются события при загрузке формы
OnCreate
OnShow
OnPaint
OnActivate
OnResize
OnPaint

Это может быть важно например для того чтобы координировать некоторые акции по управлению положением формы и т.п.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:40
Сообщение #11


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как сделать возможным передвижение формы если пользователь щелкнул в форму вне пространства заголовка?
В следующем примере показано как можно передвигать форму если пользователь "захватил" Client-пространство. Наиболее простое решение - "обмануть" Windows и Client-пространство выдать за заголовок окна.
CODE
unit DragMain;

interface

uses
 SysUtils, WinTypes, WinProcs,  Messages,
 Classes, Graphics, Controls, Forms, Dialogs, StdCrtls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure ButtonClick(Sender: TObject);
 private
   procedure WMNCHitTest(var M: TWMNCHitTest);
                message wm_NCCHitTest;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1. WMNCHitTest(var M: TWMNCHitTest);

begin
 inherited;
 if M.Result = htClient then
 M.Result := htCaption;
end;


procedure TForm1.Button1Click(Sender: TObject);

begin
 Close;
end;

end.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:40
Сообщение #12


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как эффективно организовать объявление глобальных переменных?
Один из эффективных способов организации глобальных переменных - создать отдельный Unit и в Interface-части объявить все необходимые переменные (и, естесственно, константы ежели таковые имеются). Если теперь в других модулях записать этот Unit в uses раздел, то все глобальные переменные можно использовать в рамках целого проекта (или проектов).
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:40
Сообщение #13


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как вывести главное окно справочной системы?
В 16-битных версиях справочной системы необходимо было вызывать начальное (главное) окно помощи с параметром HELP_CONTENTS в комманде HelpCommand. В 32-битном варианте это осуществляется следующим образом:
CODE
Application.HelpCommand(HELP_FINDER, 0);

Примечание: Для того, чтобы показывались "книжки" (или главные темы) - необходимо создать .CNT-файл.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:40
Сообщение #14


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как скрыть форму при старте приложения?
К сожалению при создании окна приложения ни в одном из первых событий (OnCreate, OnShow, OnActivate) нет доступа к свойству Visible. Использование функции ShowWindow с параметром SW_HIDE в OnActivate-событии решает проблему (но при этом не избежать кратковременного мерцания окна перед "исчезновением"):

CODE
procedure TForm1.OnActivate(Sender: TObject);
begin
 ShowWindow(Handle, SW_HIDE);
end;


чтобы сделать окно опять видимым необходимо вызвать ту же функцию, но уже с другим параметром:
CODE
ShowWindow(Handle, SW_SHOW);


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

CODE
procedure TForm1.OnCreate(Sender: TObject);
begin
 Left := Screen.Width;
end;


Окно создается видимым, но находится за пределами экрана!
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:41
Сообщение #15


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как ускорить навигацию по исходному тексту?
Весьма удобно при работе с текстами больше двух-трех страниц использовать метки (bookmarks).

Чтобы установить подобную метку - необходимо нажать компбинацию клавиш: CTRL+SHIFT+Число, где "Число" находится в пределах от 0 до 9. После этого можно с любого места "прыгнуть" на эту метку. Для этого необходимо нажать комбинацию CTRL+Число.

Примечание: Чтобы убрать метку - необходимо второй раз нажать CTRL+SHIFT+Число, а чтобы передвинуть метку на другое место - необходимо нажать ту же комбинацию в необходимом месте.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:41
Сообщение #16


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как создать Ini-файл в директории программы?
По умолчанию ini-файл создается в Windows-директории (например: TIniFile.Create('FOO.INI' )), что приводит к "захламлению" оной. Более логично (за исключением случаев, когда программа делается для CD-ROM) если ini-файл создается в той же директории что и главная программа. Это достигается с помощью одной строки:
CODE
IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0),'.INI'));
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:41
Сообщение #17


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как сделать отступ в Memo?
С помощью API-функции SendMessage можно задать поля в Memo-компоненте.
Если необходимо, например, сделать отступ в 20 пикселей слева то можно
это сделать следующим образом:
CODE
var Rect: TRect;
begin
 SendMessage( Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect));
 Rect.Left:= 20;
 SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect));
 Memo1.Refresh;
end;
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:42
Сообщение #18


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как создать и вызвать модальную форму?
Модальные формы довольно часто выгоднее (с точки зрения использования памяти) временно создавать, и после того, как форма был вызвана, отработана и закрыта, - освободить ее из памяти. В противном случае Delphi-приложение может быть настоящим "пожирателем памяти". Примерно так может выглядеть вызов такой формы:
CODE
ModalForm := TModalForm.Create(Self);
try
 ModalForm.ShowModal;
finally
 ModalForm.Free;
end;

Не забудте убрать ее из списка автосоздаваемых форм. Так же можно динамически создавать и немодальные формы.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:42
Сообщение #19


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Системные сообщения (сокращения)
BM  - ButtonMode
BN  - Button
BS  - ButtonStyle
CB  - ComboBox
CBN - Combo Box Notifications
CBS - ComboBoxStyle
EM  - EditMessage
ES  - EditStyle
FM  - FileManager
LB  - ListBox
LBN - ListBox Notifications
LBS - ListBoxStyle
MB  - MessageButton (Typen)
PS  - PenStyle
SB  - ScrollBar
SBS - ScrollBarStyle
SM  - SystemMetrics
SPI - SystemParametersInfo
WM  - WindowMessage
WS  - WindowStyle
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение
Mr.Floppy
сообщение Jun 29 2005, 00:42
Сообщение #20


Постоянный пользователь
****

Группа: Новички
Сообщений: 257
Регистрация: 27-June 05
Из: Москва
Пользователь №: 22
Заходит на форум с полного инета.



Как можно опросить различные параметры системы, например количество свободных ресурсов?
Для получения параметров системы существует множество различных API-функций. Для того, чтобы узнать количество свободных ресурсов, - достаточно вызова следующей API-функции:
CODE
Variable := GetFreeSystemResources(GFSR_SYSTEMRESOURCES);

Другие функции опроса параметров системы (описаны в системе помощи): GetWinFlags, SystemParametersInfo, GetDeviceCaps и GetFreeSpace.

Для 32-bit систем необходимо вызывать GetSystemMetrics, GetSystemInfo и SystemParametersInfo.
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение

3 страниц V  1 2 3 >
Тема закрытаСоздать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия Сейчас: 27th November 2020 - 02:58
 
     
Rambler's Top100 службы мониторинга серверов
Gentoo Powered Lighttpd Powered