Секция 2 из 3 - Предыдущая - Следующая
Все секции
- 1
- 2
- 3
Q-50: Какое событие происходит при минимизации окна?
------------------------------------------------------------
OnResize
Для MainForm : Application.OnMinimize
------------------------------------------------------------
Q-51: Как сохранить в 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-52: Как закрыть внешнюю программу?
------------------------------------------------------------
Например, Блокнот можно закрыть так:
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-53: Как загрузить из ImageList иконку приложения?
------------------------------------------------------------
ImageList1.GetIcon(Idx, Application.Icon);
------------------------------------------------------------
Q-54: Как отловить нажатие 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-55: В какой позиции Memo находится каретка?
------------------------------------------------------------
var
LineNum, Charnum: Integer;
....
LineNum := Memo1.Perform(EM_LINEFROMCHAR, -1, 0);
CharNum := Memo1.Perform(EM_LINEINDEX, LineNum, 0);
------------------------------------------------------------
Q-56: Почему после RichEdit1.Lines.SaveToFile(name) в файле, кроме моего
текста, ещё всякий бред написан?
------------------------------------------------------------
Таким образом в RTF сохраняется информация об оформлении текста. Если
сохранять нужно только текст, перед записью сделай
RichEdit1.PlainText := True;
------------------------------------------------------------
Q-57: Как вставить картинку в TDrawGrid?
------------------------------------------------------------
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (Sender is TDrawGrid) and
not (gdFixed in State) then
TDrawGrid(Sender).Canvas.Draw(Rect.Left, Rect.Top,
Image1.Picture.Graphic);
end;
------------------------------------------------------------
Q-58: Как дождаться завершения программы, запущенной ShellExecute?
------------------------------------------------------------
uses
ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
ProcInfo: PShellExecuteInfo;
begin
(Sender as TControl).Enabled := False;
GetMem(ProcInfo, SizeOf(ProcInfo^));
with ProcInfo^ do begin
Wnd := Handle;
cbSize := SizeOf(ProcInfo^);
lpFile := PChar('notepad.exe');
lpParameters := nil;
lpVerb := 'open';
nShow := SW_SHOW;
fMask := SEE_MASK_DOENVSUBST or SEE_MASK_NOCLOSEPROCESS;
end;
try
Win32check(ShellExecuteEx(ProcInfo));
while not Application.Terminated and
(WaitForSingleObject(ProcInfo.hProcess, 100)=WAIT_TIMEOUT) do
Application.ProcessMessages;
finally
if ProcInfo.hProcess <> 0 then CloseHandle(ProcInfo.hProcess);
Dispose(ProcInfo);
(Sender as TControl).Enabled := True;
end;
end;
------------------------------------------------------------
Q-59: Как в TMemo вставить дату в позицию каретки?
------------------------------------------------------------
Memo1.SetSelTextBuf(PChar(DateToStr(Date)));
------------------------------------------------------------
Q-60: Как отловить системную ошибку при операциях с файлами?
------------------------------------------------------------
Для Паскаль функций, например, BlockWrite, можно использовать такую
конструкцию:
try
BlockWrite(f, buf, count); //См.также хелп: параметр AmtTransferred
..
except
on E:EInOutError do
begin
ShowMessage('Произошла ошибка записи ' + E.Message);
..// пытаемся что-то поправить
if {не удалось} then
raise; //Повторно возбуждаем исключение, чтобы не удалить файл
end;
end;
..
CloseFile(..);
DeleteFile(..);
------------------------------------------------------------
Q-61: Как узнать, была ли создана ли определенная форма?
------------------------------------------------------------
function IndexOfForm (const AClassName: String; const FromIndex:
Word):Integer;
var
i : Integer;
begin
Result := -1;
for i := FromIndex to Screen.FormCount-1 do
if (CompareText(Screen.Forms[i].ClassName, AClassName) = 0) then
begin
Result := i;
Break;
end;
end;
------------------------------------------------------------
Q-62: Что такое Handle окна, и как его полyчить?
------------------------------------------------------------
Handle - это число - уникальный идентификатор окна (в данном случае) в
системе.
Получить его можно, например, так:
hwnd := FindWindow (nil, 'Form1'); //ищем окнo с заголовком "Form1"
if hwnd <> 0 then {нашлось};
------------------------------------------------------------
Q-63: Как проиграть midi файл?
------------------------------------------------------------
uses
MPlayer;
var
mp : TMediaPlayer;
procedure TForm1.Button1Click(Sender: TObject);
begin
with Sender as TButton do
case Tag of
0 :
begin
Tag := 1;
mp := TMediaPlayer.CreateParented(Handle);
mp.DeviceType := dtSequencer;
mp.FileName := 'c:\winnt\media\Canyon.mid';
mp.Wait:= True;
mp.Open;
mp.Play;
end;
1 :
begin
Tag := 0;
mp.Wait := True;
mp.Stop;
mp.Free;
end;
end;
end;
------------------------------------------------------------
Q-64: Как обратиться к свойству по его имени?
------------------------------------------------------------
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
f1 : Integer; // Это приватное поле хранит значение
published
{К свойству p1 мы будем обращаться по его имени}
property p1 : Integer read f1 write f1;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses
TypInfo;
procedure TForm1.Button1Click(Sender: TObject);
var
PInfo : PPropInfo;
begin
p1 := GetTickCount; // Здесь свойству что-то присвоили
PInfo:= GetPropInfo(TForm1.ClassInfo, 'p1'); // Получаем описание свойства
// из описания класса
if PInfo = nil then
raise Exception.Create('Property not exist');
Caption := IntToStr(GetOrdProp(Form1, PInfo)); // Получаем значение
свойства
end;
------------------------------------------------------------
Q-65: Как нажать Ctrl+Del программным путем?
------------------------------------------------------------
keybd_event(vk_control, 0, 0, 0);
keybd_event(vk_delete, 0, 0, 0);
keybd_event(vk_delete, 0, KEYEVENTF_KEYUP, 0);
keybd_event(vk_control, 0, KEYEVENTF_KEYUP, 0);
------------------------------------------------------------
Q-66: Аналог Case для строк
------------------------------------------------------------
Вопрос: Нужно определить с какой из заданных строк совпадает некая строковая
переменная и в зависимости от этого перейти к соответсвующей процедуре. Как
это выполнить без использования многочисленных if - then?
Вот способ, легко приспосабливаемый для загрузки списка из строки, файла или
ресурса:
const
vlist = 'первый, второй, третий';
var
Values: TStringList;
procedure SetValues(VL : TStringList; S: String);
var
I : Integer;
begin
VL.CommaText := S;
for I := 0 to CL.Count-1 do
VL.Objects[I] := Pointer(I);
VL.Sorted := True;
end;
function GetValueIndex(VL : TStringList; Match: String): Integer;
begin
Result := VL.IndexOf(Match);
if Result >= 0 then
Result := Integer(VL.Objects[Result]);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
case GetValueIndex(Values, Edit1.Text) of
-1: {не найден} ;
0: Caption := '0';
1: Caption := '1';
2: Caption := '2';
end;
end;
initialization
VL := TStringList.Create;
SetValues(VL, vlist);
finalization
VL.Free;
------------------------------------------------------------
Q-67: Как в TListBox пеpетаскивать итемы?
------------------------------------------------------------
DragMode := dmAutomatic;
{OnDragOver}
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := True;
end;
{OnDragDrop}
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
NewIndex : Integer;
begin
with Sender as TListBox do begin
NewIndex := ItemAtPos(Point(X,Y), True);
Items.Move(ItemIndex, NewIndex);
ItemIndex:= NewIndex;
end;
end;
------------------------------------------------------------
Q-68: Как отловить нажатие клавиш F1..F10?
------------------------------------------------------------
procedure TForm1.AppMessage(var Msg:TMsg; var Handled: Boolean);
begin
case msg.wParam of
VK_F1..VK_F10 :
case Msg.message of
WM_KEYUP: ShowMessage('Key up');
WM_KEYDOWN: ShowMessage('Key down');
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppMessage;
end;
------------------------------------------------------------
Q-69: Как записать в файл несколько TImage?
------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
with TFileStream.Create(FileName,fmCreate or fmOpenWrite) do begin
WriteComponentRes('IMAGE1', image1);
WriteComponentRes('IMAGE2', image2);
Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.Free;
Image2.Free;
RegisterClass(TImage);
Image1 := TImage.Create(Self);
Image2 := TImage.Create(Self);
with TFileStream.Create(FileName, fmOpenRead) do begin
ReadComponentRes(Image1);
ReadComponentRes(Image2);
Free;
end;
Image1.Parent:= Self;
Image2.Parent:= Self;
UnregisterClass(TImage);
end;
------------------------------------------------------------
Q-70: Как компьютеру узнать свое имя?
------------------------------------------------------------
function GetCompName: String;
var
buffer : array [0..MAX_COMPUTERNAME_LENGTH] of Char;
cb : DWord;
begin
cb := SizeOf(buffer);
GetComputerName(buffer, cb);
Result := buffer;
end;
------------------------------------------------------------
Q-71: Как узнать IP машины по имени?
------------------------------------------------------------
uses
WinSock;
const
WINSOCK_VERSION = $0101;
function GetIPAddress(Name:String): string;
var
WSAData : TWSAData;
p : PHostEnt;
begin
WSAStartup(WINSOCK_VERSION, WSAData);
p := GetHostByName(PChar(Name));
Result := inet_ntoa(PInAddr(p.h_addr_list^)^);
WSACleanup;
end;
------------------------------------------------------------
Q-72: Как показать текстовый файл в TLabel?
------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
fs : TFileStream;
s : String;
begin
fs := TFileStream.Create('unit1.pas', fmOpenRead or fmShareDenyNone );
SetLength(s, fs.Size);
fs.Read(s[1], Length(s));
fs.Free;
Label1.Caption := s;
end;
------------------------------------------------------------
Q-73: Как вставить картинку в StatusPanel?
------------------------------------------------------------
Image1.Parent := StatusBar1;
------------------------------------------------------------
Q-74: Как показывать хинты для частично видимых элементов ListBox?
------------------------------------------------------------
Написать для OnMouseMove:
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
oldidx : Longint = -1;
var
idx : Longint;
begin
with Sender as TListBox do begin
idx := ItemAtPos(Point(x,y),True);
if (idx < 0) or (idx = oldidx) then Exit;
Application.ProcessMessages;
Application.CancelHint;
oldidx := idx;
Hint := '';
if Canvas.TextWidth(Items[idx]) > Width - 4 then Hint:=Items[idx];
end;
end;
------------------------------------------------------------
Q-75: Чем отличаются TLabel и TStaticText?
------------------------------------------------------------
TLabel is TGraphicControl
TStaticText is TWinControl
То есть у последнего есть окно, это дает возможность управлять этим
контролом с помощью сообщений Windows.
------------------------------------------------------------
Q-76: Как корректнее завершать приложение- Terminate или MainForm.Close?
------------------------------------------------------------
Terminate очень грубый метод. Если вызывать Application.Terminate, то не
сработают обработчики OnCloseQuery, OnClose главной формы.
------------------------------------------------------------
Q-77: Как помигать Scroll Lock?
------------------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);
begin
keybd_event(VK_SCROLL, 0, 0, 0);
keybd_event(VK_SCROLL, 0, vk_up, 0);
end;
------------------------------------------------------------
Q-78: Как отобразить каталог?
------------------------------------------------------------
ListBox1.Perform(LB_DIR, 0, LParam(PChar('*.*')));
------------------------------------------------------------
Q-79: Как ввести текст в "чужой" Edit?
------------------------------------------------------------
SendMessage(EditHandle, WM_SETTEXT, 0, LParam(PChar('MyText')));
------------------------------------------------------------
Q-80: Как сделать программу без главной формы?
------------------------------------------------------------
program Project1;
uses
Dialogs;
begin
ShowMessage('Is there anybody out there ?' );
end.
------------------------------------------------------------
Q-81: Как показать диалог выбора директории?
------------------------------------------------------------
из модуля FileCtrl.
1. function SelectDirectory(const Caption: string; const Root: WideString;
out Directory: string): Boolean; overload;
2. function SelectDirectory(var Directory: string; Options: TSelectDirOpts;
HelpCtx: Longint): Boolean; overload;
из RxLib
TDirectoryEdit
function GetDirectory(nFolder: Longint): String;
var
Bi : TBrowseInfo;
lpName: array [0..MAX_PATH] of Char;
ppidl, aItemLst : PItemIDList;
begin
SHGetSpecialFolderLocation(Application.Handle, nFolder, ppidl);
FillChar(Bi, SizeOf(bi), 0);
Bi.hwndOwner := Application.Handle;
Bi.pidlRoot := ppidl;
Bi.pszDisplayName := lpName;
Bi.lpszTitle := 'Open directory';
aItemLst := SHBrowseForFolder(Bi);
CoTaskMemFree(ppidl);
SHGetPathFromIDList(aItemLst, lpName);
CoTaskMemFree(aItemLst);
Result := lpName;
end;
Пример использования (иначе не поймут, что такое nFolder)
// значения nFolder можно найти в описании
// к SHGetSpecialFolderLocation
// из Win32 Programmer's Reference (win32.hlp)
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetDirectory(CSIDL_DRIVES);
end;
------------------------------------------------------------
Q-82: Кaк искать oкнo по части eгo нaзвaния?
------------------------------------------------------------
function FindNextWnd(StartHWND: HWND; AString : String): HWND;
var
Buffer : array [0..255] of char;
begin
Result := StartHWND;
repeat
Result := FindWindowEx(0, Result, nil, nil);
GetWindowText(Result, Buffer, SizeOf(Buffer));
if StrPos(StrUpper(Buffer), PChar(UpperCase(AString))) <> nil
then Break;
until (Result = 0);
end;
------------------------------------------------------------
Q-83: Как yзнать текущую Ru/En pаскладкy клавиатypы?
------------------------------------------------------------
GetKeyboardLayoutName(buffer{:array [0..KL_NAMELENGTH] of Char});
case ((StrToInt('$'+ Buffer)) and $03FF) of
LANG_ENGLISH: Caption := 'Eng';
LANG_RUSSIAN: Caption := 'Rus';
end;
------------------------------------------------------------
Q-84: Как RichEdit сделать скролл на конец текста?
------------------------------------------------------------
with RichEdit do begin
SelLength := 0;
SelStart := Length(Text);
Perform(EM_SCROLLCARET,0,0);
end;
------------------------------------------------------------
Q-85: Как узнать состояние управляющих клавиш - Shift, Ctrl, Alt?
------------------------------------------------------------
function IsKeyDown(vk: Word):Boolean;
begin
Result := GetKeyState(vk) and $8000 = $8000;
end;
vk для Ctrl, Shift, Alt соответственно равны: vk_control, vk_shift и vk_menu
------------------------------------------------------------
Q-86: Как контрол может сам себя разрушить?
------------------------------------------------------------
TMyWinControl = class(TWinControl)
private
procedure WMuser1(var msg: TMessage); message WM_USER+1;
...
public
procedure Release;
...
end;
procedure TMyWinControl.WMuser1;
begin
Free;
end;
procedure TMyWinControl.Release;
begin
PostMessage(Handle, WM_USER+1, 0, 0);
end;
------------------------------------------------------------
Q-87: Как заставить MediaPlayer крутить один и тот же клип?
------------------------------------------------------------
procedure TForm1.WMUser1(var msg:TMessage);// message WM_USER+1;
begin
with MediaPlayer1 do begin
Previous;
Notify := True;
Play;
end;
end;
procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
if (Sender as TMediaPlayer).NotifyValue = nvSuccessful then
PostMessage(Handle, WM_USER+1, 0, 0);
end;
------------------------------------------------------------
Q-88: Какой класс окна у консоли?
------------------------------------------------------------
'tty' for 9x
'ConsoleWindowClass' for NT
------------------------------------------------------------
Q-89: Как спрятать контрол, если известен его Handle?
------------------------------------------------------------
ShowWindow(ButtonHandle, SW_HIDE); // SW_SHOW
------------------------------------------------------------
Q-90: Как сделать окно без VCL?
------------------------------------------------------------
program Project1;
{ Copyright (c) 1996 by Charlie Calvert
Standard Windows API application written in Object Pascal.
No VCL code included. This is all done on the Windows API
level.
Note that you need to include both Windows and Messages!}
uses
Windows, Messages;
const
AppName = 'Window1';
function WindowProc(Window: HWnd; AMessage, WParam,
LParam: Longint): Longint; stdcall;
begin
WindowProc := 0;
case AMessage of
wm_Destroy: begin
PostQuitMessage(0);
Exit;
end;
end;
WindowProc := DefWindowProc(Window, AMessage, WParam, LParam);
end;
{ Register the Window Class }
function WinRegister: Boolean;
var
WindowClass: TWndClass;
begin
WindowClass.Style := cs_hRedraw or cs_vRedraw;
WindowClass.lpfnWndProc := @WindowProc;
WindowClass.cbClsExtra := 0;
WindowClass.cbWndExtra := 0;
WindowClass.hInstance := HInstance;
WindowClass.hIcon := LoadIcon(0, idi_Application);
WindowClass.hCursor := LoadCursor(0, idc_Arrow);
WindowClass.hbrBackground := HBrush(Color_Window);
WindowClass.lpszMenuName := nil;
WindowClass.lpszClassName := AppName;
Result := RegisterClass(WindowClass) <> 0;
end;
{ Create the Window Class }
function WinCreate: HWnd;
var
hWindow: HWnd;
begin
hWindow := CreateWindow(AppName, 'Object Pascal Window',
ws_OverlappedWindow, cw_UseDefault, cw_UseDefault,
cw_UseDefault, cw_UseDefault, 0, 0, HInstance, nil);
if hWindow <> 0 then begin
ShowWindow(hWindow, CmdShow);
UpdateWindow(hWindow);
end;
Result := hWindow;
end;
var
AMessage: TMsg;
hWindow: HWnd;
begin
if not WinRegister then begin
MessageBox(0, 'Register failed', nil, mb_Ok);
Exit;
end;
hWindow := WinCreate;
if hWindow = 0 then begin
MessageBox(0, 'WinCreate failed', nil, mb_Ok);
Exit;
end;
while GetMessage(AMessage, 0, 0, 0) do begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
Halt(AMessage.wParam);
end.
------------------------------------------------------------
Q-91: Как записать массив в файл?
------------------------------------------------------------
with TFileStream.Create('array.dat', fmCreate or fmOpenWrite) do begin
WriteBuffer(a, SizeOf(a));
Free;
end;
------------------------------------------------------------
Q-92: О библиотеке RxLib
------------------------------------------------------------
На сайте delphiplus.org в разделе Бесплатно|RXLibrary
(http://delphiplus.spils.lv/RXLibrary.html) лежит RX Library 2.75 с help'ами
и четырьмя неофициальными портами RX Library 2.75 под Delphi 6:
1. Версия 1.1 (1.18M) от Oxygen Software
2. Версия 1 (1.36M) от Dennis Ortiz
3. Патч на RxLib версия 1.5 (437K) от Polaris Software
4. Версия от Epsylon Technologies
Anatoly Podgoretsky wrote:
>
> Hi, Delphi Plus!
> You wrote to Anatoly Podgoretsky on Tue, 20 Nov 2001 16:00:55 +0000 (UTC):
>
> DP> 14.11.2001 в раздел "Бесплатно|Компоненты" выложен четвертый
> DP> неофициальный порт RX Library 2.75 под Delphi 6 (от Epsylon
> DP> Technologies).
>
> DP> http://www.delphiplus.org - ежедневные новости информационных
> DP> технологий http://www.faq.delphiplus.org - коллекция FAQ по Delphi
>
> Прекрасно, этим я больше доверяю, а как вообще насчет характеристики всех
> четырех портов, а то у людей глаза разбегаются :-)
Epsylon Technologies
-------------------
Здравствуйте!
Мы были вынуждены сделать свой вариант RxLib потому, что остальные нас
немного не устраивали.
Сразу скажу, зачем нам вообще нужна библиотека RxLib - она используется в
нашем продукте в качестве некоего примера всем известных компонентов.
Поэтому к такой библиотеке с нашей стороны предъявлялось требование
максимальной стандартности, если можно применить такой термин. Кроме того,
наш продукт поддерживает несколько версий Delphi и C++Builder, поэтому от
такой библиотеки требуется одновременная поддержка всех нужных нам версий
компиляторов.
Естественно, мы рассматривали варианты использования уже готовой работы по
адаптированию библиотеки под Delphi 6.0.
Однако:
- вариант от Polaris заточен для использования пакета Polaris Library.
Туда что-то добавлено, что-то починено, что-то переделано. Иначе
говоря, этот вариант не может быть стандартным;
- вариант от Oxygen является версией ТОЛЬКО под Delphi 6.0, содержит ряд
мелких неточностей при переводе design-time кода. Также там что-то
изменено по сравнению с 2.75. Кроме того, не переименован модуль
AppUtils.pas;
- вариант от Dennis Ortiz также является версией только под Delphi 6.0.
Ничего не могу сказать про нее - мы туда глубоко не заглядывали.
Не совсем понятно, зачем выкидывать из библиотеки возможность поддержки
предыдущих версий Delphi, когда добавить вариант кода для Delphi 6.0 ничуть
не сложнее. Никто также не против исправления каких-либо ошибок в
библиотеке, но давайте делать это централизованно, если уж авторы забили на
свое детище. Например, через тот же Source Forge.
Наш вариант основан на общедоступном коде, и содержит модули из 2.75,
включая update от 16.12.1999 и патч для C+Builder 5.0 от 30.05.2000. В эти
модули добавлена возможность работы под Delphi 6.0, в том числе добавлен
макрос RX_D6 и переименованы модули AppUtils и StrUtils. Все. Ничего больше.
Никакая старая функциональность не удалена, никакие баги не чинились. Полдня
работы.
--
Andrey Dementyev, Epsylon Technologies, http://www.epsylontech.com
Chief Software Architect
Информация от delphiplus
------------------------
1. C 19-ого декабря компания SGB Software совместно с Ником Ходж (Nick
Hodges) из Borland support team займется дальнейшим развитием RxLib.
Надеются выпустить 3-ю версию к середине марта 2002 года. Все желающие могут
принять участие в этой работе, для этого достаточно написать на
RxLIb@SGBSoftware.com.
2. На DelphiPlus выложен материал "A где сейчас RXLib?" - заметка написанная
по материалам переписки в эхе fido7.ru.delphi.
------------------------------------------------------------
Q-93: Как вывести ProgresBar на StatusBar?
------------------------------------------------------------
--- Андрей Барташ
Gauge:=TGauge.Create(Form1);
Gauge.Parent:= StatusBar1;
Gauge.Top:=4;
Gauge.Left := 116;
Gauge.Height := 15;
Gauge.Width := 200;
Компонент TGauge находится на закладке Samples
------------------------------------------------------------
Q-94: Как нажать клавиши в другом приложении?
------------------------------------------------------------
"Нажимаем" клавиши в Блокноте (уже запущенном):
uses Sendkey; {описан ниже}
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
begin
h := FindWindow('Notepad', nil); // ищем окно Блокнота
SendMessage(h, WM_SYSCOMMAND, SC_HOTKEY, h); // активизируем его
PlayKeys(StrToKeys('abcdef')); // нажимаем клавиши
SendMessage(Handle, WM_SYSCOMMAND, SC_HOTKEY, Handle); // возвращаем фокус
end;
Коды vk_ клавиш можно найти в Win32 Programmer's Reference (win32.hlp):
Virtual-Key Codes. {В дельфи не описаны коды клавиш ['A'..'Z'] и ['0'..'9'],
их получают с помощью Ord, например, Ord('A'), Ord('9')}.
Символы из верхнего ряда клавиатуры посылаются с нажатым Shift. Заметим, что
символы в локальной кодировке могут быть посланы после переключения
кодировки в активном приложении, например, если перключатель (switch)
Control-Shift, то это:
PlayKeys(Chr(vk_control)+#0+Chr(vk_shift)+#0); {downkey = #0};
--- unit Sndkey.pas ---
unit sndkey;
interface
uses
Windows,
Messages;
const
{VK constants missing from windows.pas}
VK_SEMICOLON = 186; {;}
VK_EQUAL = 187; {=}
VK_COMMA = 188; {,}
VK_MINUS = 189; {-}
VK_PERIOD = 190; {.}
VK_SLASH = 191; {/}
VK_BACKQUOTE = 192; {`}
VK_LEFTBRACKET = 219; {[}
VK_BACKSLASH = 220; {\}
VK_RIGHTBRACKET = 221; {]}
VK_QUOTE = 222; {'}
downkey = #0;
upkey = Chr(KEYEVENTF_KEYUP); {#2}
procedure PlayKeys(const keys: String);
function StrToKeys(const s: String): String;
{Alt-F4:
PlayKeys(Chr(vk_menu)+#0+Chr(vk_f4)+#0+Chr(vk_f4)+#2+Chr(vk_menu)+#2)}
{"exit"<return>: PlayKeys(StrToKeys('exit'+chr(vk_return)));}
{"EXIT":
PlayKeys(Chr(vk_shift)+downkey+StrToKeys('exit')+Chr(vk_shift)+upkey));}
{or short form: PlayKeys(Chr(vk_shift)+#0+StrToKeys('exit'));}
implementation
function StrToKeys; {keystroke for alone keys}
var
i: Longint;
c: Char;
begin
for i := 1 to Length(s) do
begin
c := s[i];
if c in ['a'..'z'] then {Upper}
c := Chr(Ord(c) and not $20);
Result := Result + c + downkey
+ c + upkey;
end;
end;
procedure PlayKeys;
const
ExtendedKeys : set of byte =
[ vk_up, vk_down,
vk_left, vk_right,
vk_home, vk_end,
vk_prior, vk_next,
vk_insert, vk_delete];
var
i, ips : Longint;
fb, sb: Byte;
keysdown: String;
procedure keybd (vk, kp : Byte);
begin
if vk in ExtendedKeys then
kp := kp + KEYEVENTF_EXTENDEDKEY;
keybd_event(vk, MapVirtualKey(vk, 0), kp, 0);
end;
begin
keysdown := '';
for i := 1 to Length(keys) div 2 do
begin
fb:= Ord(keys[2*i -1]);
sb:= Ord(keys[2*i]);
if sb = Ord(downkey) then
keysdown := keysdown + Chr(fb)
else
begin
ips := pos(Chr(fb), keysdown);
if ips > 0 then
Delete(keysdown, ips, 1)
else
Continue;
end;
keybd(fb, sb);
end;
{Autocomplete}
for i := 1 to Length(keysdown) do
keybd(Ord(keysdown[i]), Ord(upkey));
end;
end.
--- EOF unit Sndkey.pas ---
Leonid Troyanovsky <lv.t@eco-pro.ru>
------------------------------------------------------------
Q-95: Как узнать версию Windows?
------------------------------------------------------------
type
TWinVersion = (wvUnknown,wv95,wv98,wvME,wvNT3,wvNT4,wvW2K,wvXP);
function DetectWinVersion : TWinVersion;
var
OSVersionInfo : TOSVersionInfo;
begin
Result := wvUnknown;
OSVersionInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
if GetVersionEx(OSVersionInfo) then begin
case OSVersionInfo.DwMajorVersion of
3: Result := wvNT3;
4: case OSVersionInfo.DwMinorVersion of
0: if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT
then Result := wvNT4
else Result := wv95;
10: Result := wv98;
90: Result := wvME;
end;
5: case OSVersionInfo.DwMinorVersion of
0: Result := wvW2K;
1: Result := wvXP;
end;
end;
end;
end;
function DetectWinVersionStr : string;
const
VersStr : array[TWinVersion] of string = (
'Unknown',
'Windows 95',
'Windows 98',
'Windows ME',
'Windows NT 3',
'Windows NT 4',
'Windows 2000',
'Windows XP');
begin
Result := VersStr[DetectWinVersion];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Ver := DetectWinVersion;
Label1.Caption := IntToStr(Ord(DetectWinVersion));
Label2.Caption := DetectWinVersionStr;
end;
Дополнительную информацию можно посмотреть в fido7.ru.delphi FAQ, тема Q79 -
"Как узнать версию Windows?"
Анатолий Подгорецкий
Секция 2 из 3 - Предыдущая - Следующая
© faqs.org.ru