Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

Дайджест по конференции RU.DELPHI (редакция от 12-02-99)


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

>      Каким  образом  можно  узнать  какая нажата кнопка на клавиатуре
> (мыши)  вне  зависимости  от  того, какое  приложение в данный момент
> активно?

  GetAsyncKeyState. И для клавиатуpы, и для мыши.
------------------------------------------------------------------------------

> Как мне получить путь к запущенной программе из нее самой?

  Application.EXEName;
------------------------------------------------------------------------------

> Как в Delphi определить, где установлена Windows?

  GetWindowsDirectory

  Пример:

  var  Windir  : String;
       WindirP : PChar;
  ................................................
       WinDirP := StrAlloc(MAX_PATH);
       Res := GetWindowsDirectory(WinDirP, MAX_PATH);
       if Res > 0 then WinDir := StrPas(WinDirP);
  ................................................
------------------------------------------------------------------------------
> Каким образом можно убрать приложение из Task Bar?

  ShowWindow(Application.Handle,SW_HIDE);
------------------------------------------------------------------------------
> Каким образом можно убрать приложение из Task List? (Только для Win'9x)

  Пример:
  unit hideprg;
  interface
  procedure TryToHide;
  implementation
  procedure RegisterServiceProcess; external 'kernel32.dll' name
                                             'RegisterServiceProcess';
  procedure TryToHide;assembler;
  asm
    push 1
    push 0
    call RegisterServiceProcess;
  end;
------------------------------------------------------------------------------
> Каким образом можно спрятать приложение от показа при нажатии Alt+Tab?

  Пример (работает только в Win'95):

  var  WnHnd   : Integer;
  ........................................................
  WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE);
  WnHnd := WnHnd or WS_EX_TOOLWINDOW;
  SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);
  ........................................................

------------------------------------------------------------------------------
> Как можно сделать форму прозрачной?

  Для этого необходимо пеpеопpеделить обpаботчик события OnCreate:

  procedure TForm1.FormCreate(Sender: TObject);
  begin
     Brush.Style:=bsClear;
  end;
------------------------------------------------------------------------------
> Как сделать произвольную (непрямоугольную) форму?

Win32 (Windows'95 or Windows NT 4.0 or above).
Достаточно создать регион нужной формы и вызвать SetWindowRgn -
HRGN rgn := CreateEllipticRgn( 10,10,100,100 );
SetWindowRgn( hMyWnd,rgn );     // Вот и будет круглое окно
При этом регион этот теперь используется Windows и будет уничтожен при
закрытии окна.

  Вот, например:
  ........................................................
  procedure TForm1.FormCreate(Sender: TObject);
  const W=36*pi/180;
  var   R,R1,R2: HRgn; X,Y,i:integer;
     function S(a:integer;R:integer):integer;
     begin
       Result:=round(R*sin(W*a));
     end;
     function C(a:integer;R:integer):integer;
     begin
       Result:=round(R*cos(W*a));
     end;
     function GetStarReg(X,Y,R:integer):HRGN;
     var  P : array [0..4] of TPoint;
     begin
        P[0] := Point(X, Y-R);
        P[1] := Point(X-S(4,R), Y-C(4,R));
        P[2] := Point(X-S(8,R), Y-C(8,R));
        P[3] := Point(X-S(2,R), Y-C(2,R));
        P[4] := Point(X-S(6,R), Y-C(6,R));
        Result := CreatePolygonRgn(P, 5, WINDING);
     end;
  begin
     X:=Width div 2;
     Y:=Height div 2;
     R:=GetStarReg(X,Y,100);
     i:=1;
     repeat
       R1:=GetStarReg(X-S(i,120),Y-C(i,110),40);
       CombineRgn(R,R,R1,RGN_OR);
       inc(i,2);
     until i>9;
     R1:=GetStarReg(X,Y,30);
     CombineRgn(R,R,R1,RGN_DIFF);
     R1:=CreateEllipticRgn(3,3,Width-6,Height-6);
     R2:=CreateEllipticRgn(20,10,Width-20,Height-10);
     CombineRgn(R1,R1,R2,RGN_DIFF);
     CombineRgn(R,R,R1,RGN_OR);
     SetWindowRgn(Handle, R, True);
  end;
  ........................................................

------------------------------------------------------------------------------
> Как создать файлы с уникальными именами?

  Здесь удобнее всего использовать имя, состоящее из даты и времени, напри-
  мер: 2310566160798 для 23:10:56 16-07-98. Если перевести это число в 32-чную
  систему счисления, получим искомые восемь символов имени файла. Это хорошо
  использовать, если программа создает много файлов, которые потом будут ис-
  пользоваться. Если же нужно создать несколько временных файлов, то лучше
  воспользоваться фyнкцией GetTempFileName. 
------------------------------------------------------------------------------
> Как программно переключать раскладку клавиатуры?

  LoadKeyboardLayout('00000409', KLF_ACTIVATE); // английский
  LoadKeyboardLayout('00000419', KLF_ACTIVATE); // русский
------------------------------------------------------------------------------
> Как сделать невидимой главную форму?

Hаписать  Application.ShowMainForm:=false в файле пpоекта.
------------------------------------------------------------------------------

> Как запустить создание письма по указанному адресу?
> Как запустить браузер по http-адресу?

Сначала необходимо написать в разделе uses ShellAPI.

E-mail:
ShellExecute(Application.Handle,'open','mailto:towho@mysite.com',nil,nil,0);

Страничку:
ShellExecute(Application.Handle,'open','http://mysite.com,nil,nil,0);
------------------------------------------------------------------------------
> Как рисовать прямо на экране?

  ........................................................
  Procedure DrawOnScreen;
  Var DC:HDC;
      DesktopCanvas:TCanvas;
  begin
    DC:=GetDC(0);   // получили DC экрана
    try
       DesktopCanvas:=TCanvas.Create;
       DesktopCanvas.Handle:=DC;
       ..................
       // здесь рисуем на Canvas экрана
       ..................
    finally
      ReleaseDC(0,DC);
      DesktopCanvas.Free;
    end;
  end;
  ........................................................
------------------------------------------------------------------------------
> Как увеличить в RichEdit размер редактируемого файла?

RichEdit1.Perform(EM_LIMITTEXT, нужный размер , 0);
Перед каждым открытием файла это действие необходимо повторять.
------------------------------------------------------------------------------
> В каком порядке происходят события при создании и показе окна?

   OnCreate, OnShow, OnPaint, OnActivate, OnResize и снова OnPaint.
------------------------------------------------------------------------------
> Если приложение долго выполняет какой-то цикл, как сделать так, чтобы
> остальные приложения не подвисали?

1. Вставить в тело цикла: Application.ProcessMessages
2. Запустить этот цикл как отдельный процесс, используя класс TThread.
------------------------------------------------------------------------------
> Как перекодировать строки из Win(1251) кодовой страницы в Dos(866) кодовую
> страницу и обратно?

CharToOEM/OEMToChar  и  CharToOEMBuff/OEMToCharBuff.
------------------------------------------------------------------------------
> Как использовать анимированные курсоры в программе?

  Пример формы, использующей анимированный курсор:
  ........................................................
  procedure TForm1.Button1Click(Sender: TObject);
  var
    h : THandle;
  begin
    h := LoadImage(0,'C:\TheWall\Magic.ani',
      IMAGE_CURSOR, 0, 0,
      LR_DEFAULTSIZE or LR_LOADFROMFILE);
    if h = 0 then ShowMessage('Cursor not loaded')
    else
    begin
      Screen.Cursors[1] := h;
      Form1.Cursor := 1;
    end;
  end;
  ........................................................
------------------------------------------------------------------------------
> Как сделать так, чтобы по Alt-F4 форма не закрывалась, а выдавала запрос
> на сохранение?

Обрабатывать событие OnCloseQuery
------------------------------------------------------------------------------
> Как выключить/включить PC Speaker?

Выключить:
  SyStemParametersInfo(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE);

Включить:
  SyStemParametersInfo(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE);
------------------------------------------------------------------------------
> Как скопировать файл?

  Эта процедура позволяет скопиpовать как весь файл пpи From и Count = 0,
  так и пpоизвольный его кусок.
  ........................................................
  function CopyFile( InFile,OutFile: String; From,Count: Longint ): Longint;
  var
    InFS,OutFS: TFileStream;
  begin
    InFS  := TFileStream.Create( InFile,  fmOpenRead );
    OutFS := TFileStream.Create( OutFile, fmCreate   );
    InFS.Seek( From, soFromBeginning );
    Result := OutFS.CopyFrom( InFS, Count );
    InFS.Free;
    OutFS.Free;
  end;
  ........................................................
------------------------------------------------------------------------------
> Как инсталлировать на время работы программы свои шрифты?

  Добавить фонт (.fon, .fot, .fnt, .ttf) в систему можно след. образом:
  ........................................................
  {$IFDEF WIN32}
  AddFontResource( PChar( my_font_PathName { AnsiString } ) );
  {$ELSE}
  var
    ss  : array [ 0..255 ] of Char;

  AddFontResource ( StrPCopy ( ss, my_font_PathName ));
  {$ENDIF}
  SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );
  ........................................................

  Убрать его по окончании работы:
  ........................................................
  {$IFDEF WIN32}
  RemoveFontResource ( PChar(my_font_PathName) );
  {$ELSE}
  RemoveFontResource ( StrPCopy ( ss, my_font_PathName ));
  {$ENDIF}
  SendMessage ( HWND_BROADCAST, WM_FONTCHANGE, 0, 0 );
  ........................................................

Где my_font_PathName - полный путь к файлу со шрифтом.
------------------------------------------------------------------------------
> Как узнать текущее разрешение экрана?

Screen.Width и Screen.Height
------------------------------------------------------------------------------
> Как в TMemo определить номер строки, в которой находится курсор и его
> местоположение в строке?

  ........................................................
  var X,Y: LongInt;

  Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
  X:=Memo1.Parform(EM_LINEINDEX, Y, 0);
  inc(Y);
  X:=Memo1.SelStart-X+1;
  ........................................................
------------------------------------------------------------------------------
> Есть программа на Delphi, котоpая отображает какой-то html. В html исполь-
> зуется gif-файл. Как в Delphi-пpоекте указать, чтобы этот gif находился
> в exe как некий кусок кода. А когда надо будет, записать его обратно в
> gif-файл без изменений, выковырнув из exe?

   Можно, используя RxLib. После его установки в меню View появится пунктик
Project Resources. Hужно выбрать Project Resources->New->User Data и добавить
нужный файл. В данном случае ресурс был назван "RCDATA_1".

   Если RxLib нет, то нужно создать файл описания ресурсов:

=== Begin gifs.rc ===
mygif rcdata "имя_gif-файла.gif"
mygif1 rcdata "RCDATA_1"
=== End dots.rc ===

Потом скомпилировать его командой brcc32 gifs.rc и получить gifs.res
В начало модуля добавь строчку {$R gifs.res}

В своей программе необходимо написать:

var
  rs     : TResourceStream;
  a      : Pointer;
begin
  rs:=TResourceStream.Create(hinstance,'RCDATA_1',RT_RCDATA);
  try
    GetMem(a,rs.size);
    rs.Read(a^,rs.size);  {Теперь a - динамический указатель на код}

    { Здесь делается все, что необходимо с кодом, используя указатель a }
 
    FreeMem(a);
  finally
    rs.Free;
  end;
end;

А можно и так, если необходимо записать ресурс в файл:
var
  rs     : TResourceStream;
  fs     : TFileStream;
begin
   rs:=TResourceStream.Create(hInstance, 'mygif', RT_RCDATA);
   fs:=TFileStream.Create('имя_gif-файла.gif', fmCreate);
   try
     fs.CopyFrom(rs, rs.Size);
   finally
     fs.Free;
     rs.Free;
   end;
end;
------------------------------------------------------------------------------

> Как быстро выводить графику? (А то Canvas очень медленно работает).

  Вот пример заполнения формами точками случайного цвета.
  ........................................................
  type
    TRGB=record
      b,g,r:byte;
    end;
    ARGB=array [0..1] of TRGB;
    PARGB=^ARGB;

  var
    b:TBitMap;

  procedure TForm1.FormCreate(sender:TObject);
  begin
    b:=TBitMap.Create;
    b.pixelformat:=pf24bit;
    b.width:=Clientwidth;
    b.height:=Clientheight;
  end;

  procedure TForm1.Tim1OnTimer(sender:TObject);
  Var
    p:PARGB;
    x,y:integer;
  begin
    for y:=0 to b.height-1 do
    begin
      p:=b.scanline[y];
      for x:=0 to b.width-1 do
      begin
        p[x].r:=random(256);
        p[x].g:=random(256);
        p[x].b:=random(256);
      end;
    end;
    canvas.draw(0,0,b);
  end;

  procedure TForm1.FormDestroy(sender:TObject);
  begin
    b.free;
  end;
  ........................................................
------------------------------------------------------------------------------
> Как программно создать ярлык?

  ........................................................
  uses ShlObj, ComObj, ActiveX;
  
  procedure CreateLink(const PathObj, PathLink, Desc, Param: string);
  var
    IObject: IUnknown;
    SLink: IShellLink;
    PFile: IPersistFile;
  begin
    IObject := CreateComObject(CLSID_ShellLink);
    SLink := IObject as IShellLink;
    PFile := IObject as IPersistFile;
    with SLink do begin
      SetArguments(PChar(Param));
      SetDescription(PChar(Desc));
      SetPath(PChar(PathObj));
    end;
    PFile.Save(PWChar(WideString(PathLink)), FALSE);
  end;
  ........................................................
------------------------------------------------------------------------------
> Как перетаскивать форму не только за Caption, но и за любое другое место?

     ........................................................
       TForm1 = class(TForm)
       ...
       private
       ...
         procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
       ...
       end;

   ...
   procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
   begin
     inherited;                    { вызов унаследованного обpаботчика      }
     if  M.Result = htClient then  { Мышь сидит на окне?                    }
       M.Result := htCaption;      { Если да - то пусть Windows думает, что }
                                   { мышь на caption bar                    }
   end;                           
  ........................................................









helloworld.ru © 2001-2021
Все права защищены