faqs.org.ru

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

RU.DELPHI.CHAINIK FAQ

Секция 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 - Предыдущая - Следующая

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

© faqs.org.ru