Sebestyen Adam-Cafe Delphi(Tippek Es Trukkok)

download Sebestyen Adam-Cafe Delphi(Tippek Es Trukkok)

of 69

Transcript of Sebestyen Adam-Cafe Delphi(Tippek Es Trukkok)

Sebestyn dm Caf Delphi (tippek s trkkk)Titkosts

Egy egyszer szveg-titkost rutin A szvegek titkostsa szmtalan formban lehetsges; az albbiakban bemutatsra kerl mdszer az egyik legegyszerbb ezek kzl. Ez a md bven elegend arra, hogy ne tudjk elolvasni a szveget, de ha valaki igazn fel akarja trni a titkostst, akkor annak nem fog sok idejbe kerlni. :-)D3 D4 Forrs: Robert Vivrette Utols mdosts: 1999. jlius 8.

Alapveten a szvegek titkostsnak elve a betk olyanmd sszekeverse, hogy utna az eredeti szveg adatvesztesg nlkl visszallthat legyen. Az albbi pldban hasznlt technika alapja a bit-ek eltolsa: a karaktereket egy byte rtknek vesszk s meghatrozott hellyel eltoljuk a bit-jeit jobbra vagy balra. Ha valamelyik bit "tlcsszik" a byte vgn, akkor az az elejre kerl (pl. ha a jobb oldalon lpi tl a byte hatrt, akkor a bal oldalon tnik fel). Pldul a '01010011' rtk hrom bit-tel balra eltolva '10011010' lenne. Ha ezt az rtket hrom bittel jobbra tolnnk el, akkor az eredeti rtk visszallna. 1. Az els dolog: egy fggvny ksztse, amely egy karakter bit-jeit meghatrozott hellyel eltolja valamelyik irnyba, s visszaadja annak titkostott rtkt.Function RotateBits(C: Char; Bits: Integer): Char; var SI : Word; begin Bits := Bits mod 8; if Bits < 0 then // balra begin // Az adatokat egy Word (2 byte) jobb felbe helyezzk SI := MakeWord(Byte(C),0); // Meghatrozott bit-tel eltoljuk balra... SI := SI shl Abs(Bits); end else // ...jobbra begin // Az adatokat egy Word (2 byte) bal felbe helyezzk SI := MakeWord(0,Byte(C)); // Meghatrozott bit-tel eltoljuk jobbra SI := SI shr Abs(Bits); end; SI := Lo(SI) or Hi(SI); Result := Chr(SI); end;

Elszr maximum 8-ra korltozzuk a valamelyik irnyba trtn mozgatst. Ha az rtk negatv, balra tolja el, egybknt pedig jobbra. A mod fggvnnyel biztostjuk, hogy az eredmny -7 s 7 kz essen. Ezutn a byte-ot elhelyezzk egy Word rtk jobb vagy bal felben. Mivel a Word 2 byte-ot tartalmaz, a msodik byte-jt fogjuk hasznlni az eredeti byte eltolt bit-jeinek trolsra. Ha balra tolom el ket, akkor a Word jobb felbe helyezem az rtket, ha pedig jobbra, akkor a bal felbe. Ezt

kveten az SHL (Shift Left) vagy az SHR (Shift Right) eljrsok megfelel hasznlatval eltolom a biteket balra illetve jobbra. A vgs feladat ennek a kt rtknek az egyestse. Ezt a Word els (hi-order) s msodik (loorder) byte-jnak OR opertorral trtn sszekapcsolsval rhetjk el. Ennek hatsra a kt byte rtke egy byte-t egyesl. Ezt a byte rtket talaktjuk egy Char tpus rtkk; ez lesz vgl a fggvny visszatr eredmnye. 2. s most lssuk a f-eljrst, amely elvgzi a titkostst s a dekdolst:Function Encryption(Str,Pwd: String; Encode: Boolean): String; var a,PwdChk,Direction,ShiftVal,PasswordDigit : Integer; begin PasswordDigit := 1; PwdChk := 0; for a := 1 to Length(Pwd) do Inc(PwdChk,Ord(Pwd[a])); Result := Str; if Encode then Direction := -1 else Direction := 1; for a := 1 to Length(Result) do begin if Length(Pwd)=0 then ShiftVal := a else ShiftVal := Ord(Pwd[PasswordDigit]); if Odd(A) then Result[A] := RotateBits(Result[A],-Direction*(ShiftVal+PwdChk)) else Result[A] := RotateBits(Result[A],Direction*(ShiftVal+PwdChk)); inc(PasswordDigit); if PasswordDigit > Length(Pwd) then PasswordDigit := 1; end; end;

A fenti fggvnynek hrom paramtere van. Az els a bemeneti, titkostand szveg (Str) a msodik a jelsz (Pwd), (amennyiben megadjuk), a harmadik pedig egy logikai tpusu paramter, amely meghatrozza, hogy titkostani vagy dekdolni akarunk. Elsknt a jelsz karaktereinek Ord rtkt (sorszmt vagy ASCII kdjt) sszeadjuk. Ez egy tovbbi lehetsget nyjt a szveg megkeversre. Utna nincs is ms dolgunk, mint hogy a titkostand szveg karakterein vgighaladva a RotateBits fggvny segtsgvel sszekeverjk annak tartalmt. Amennyiben megadtunk valamilyen jelszt, akkor annak ASCII kdjt vesszk rtkl a karakterek eltolsa tekintetben. A ciklus minden egyes vgigfutsnl a jelsz kvetkez karaktert vesszk alapul. (Ha a vgre rtnk, akkor az els karakter kvetkezik.) Ha nincs jelsz, akkor az eltolsi rtk a ciklusnak a szvegben aktulisan elrt helynek rtkt veszi fel. (pl. Ha az els karakteren ll, akkor 1, ha a msodikon, akkor 2, etc.) Vgl: ha a szveg pratlan sorszm karakern llunk (pl. 1., 3., 5.), akkor a biteket balra toljuk, ha pedig proson, akkor jobbra. A Direction rtk pedig az egsz folyamat irnyt fordtja meg, attl

fggen, hogy titkostst vagy dekdolst adtunk meg a fggvny harmadik paramterben.Windows s WinAPI

"Stay On Top" Formok Ha olyan Formot akarunk kszteni, amely mindig legfll (a tbbi ablak fltt) marad, akkor hasznlhatjuk a Delphi "FormStyle" tulajdonsgnak "fsStayOnTop" belltst. Azonban, ha futsidben vltoztatjuk meg ezt a tulajdonsgot, az villan egyet amikor az j mdra tvlt.D2 D3 D4 Forrs: ZDTips Utols mdosts: 1999. mrcius 24.

Az albbi API hvs e zavar villans nlkl ri el, hogy a Form legfell maradjon (mindig ltszon): Helyettestsd be a "Form1"-et a sajt Formod nevvel s mr ksz is. Ha Form helyzett vissza akarod lltani normlra, akkor azt a kvetkez mdon teheted meg:SetWindowPos(Form1.Handle, HWND_NOTOPMOST, Form1.Left, Form1.Top, Form1.Width, Form1.Height, 0); SetWindowPos(Form1.Handle, HWND_TOPMOST, Form1.Left, Form1.Top, Form1.Width, Form1.Height, 0);

A Windows TEMP (ideiglenes) knyvtrnak megllaptsa D1 D2 D3 D4 Forrs: ZDTips Utols mdosts: 1999. prilis 18. A Windows 95/98 s az NT is kijell egy knyvtrat az ideiglenes fjloknak. A felhasznlk azonban gyakran megvltoztatjk ennek a knyvtrnak a helyt, s az gy mr nem a Windows alapllapot szerinti helyen lesz. A GetTempPath Windows API fggvny visszaadja az ideiglenes (Temporary) knyvtr aktulis helyt (elrsi tjt):function GetTempDirectory : String; var TempDir : array [0..255] of Char; begin GetTempPath(255, @TempDir); Result := StrPas(TempDir); end;

A GetTempPath fggvny az ideiglenes knyvtr elrsi tjt a kvetkez sorrendben adja vissza: 1. a TMP krnyezetben meghatrozott vltoz; 2. a TEMP krnyezetben meghatrozott vltoz, ha a TMP nincs meghatrozva; 3. az aktulis knyvtr, ha sem a TMP, sem a TEMP nincs meghatrozva. Az alkalmazs memria-felhasznlsnak cskkentse Egy egyszer mdja az alkalmazs ltal felhasznlt memria cskkentsnek feltve, hogy a program nem hasznl OLE-t - az, hogy felszabadtod az OLE-hoz szksges DLL-eket.D2 D3 D4 Forrs: www.preview.org Utols mdosts: 1999. mjus 14. FreeLibrary(GetModuleHandle('OleAut32'));

Ez az eljrs felszabadtja az OleAut32.dll-t s az OLE32.dll-t, gy az alkalmazs kzel 1MB-tal kevesebb memrit hasznl a RAM-bl.

A Windows s a rendszer jraindtsa A Windowst illetve az egsz rendszert az ExitWindows WinAPI fggvnnyel tudod jraindtani.D1 D2 D3 D4 Forrs: Mike O'Hanlon Utols mdosts: 1999. mjus 19.

1. A Windows jraindtsa a rendszer jraindtsa nlkl:procedure TMainForm.RestartWindowsBtnClick(Sender: TObject); begin if not ExitWindows(EW_RestartWindows, 0) then ShowMessage('Az egyik alkalmazst nem lehet bezrni.'); end;

2. Az egsz rendszer jraindtsa:procedure TMainForm.RebootSystemBtnClick(Sender: TObject); begin if not ExitWindows(EW_RebootSystem, 0) then ShowMessage('Az egyik alkalmazst nem lehet bezrni.'); end;

A monitor energiatakarkos zemmdba helyezseD2 D3 D4 Forrs: Alan G. LLoyd Utols mdosts: 1999. mjus 24.

1. A monitor kikapcsolsa:SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

2. A monitor bekapcsolsa:SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

Termszetesen ez a mdszer csak az olyan monitoroknl mkdik, amelyeknek van energiatakarkos zemmdja. A Windows knyvtr megllaptsa A Windows knyvtr helyt a GetWindowsDirectory fggvnnyel tudjuk megllaptani. (Ennek a fggvnynek a DOS-os megfelelje a GetWindowsDir, amelyet azonban nem hasznlhatunk windowsos alkalmazsban.)D1 D2 D3 D4 Forrs: Windows API Help Utols mdosts: 1999. mjus 30.

Az albbi fggvny visszaadja a Windows knyvtr helyt (elrsi tjt):function FindWindowsDir : string; var pWindowsDir : array [0..255] of Char; sWindowsDir : string; begin GetWindowsDirectory (pWindowsDir, 255); sWindowsDir := StrPas (pWindowsDir); Result := sWindowsDir ; end;

ystem Tray alkalmazsok ksztse Egy System Tray alkalmazs elksztse alapveten hrom f lpsre bonthat le: a) A program ikonjnak hozzadsa a SysTray-hez. b) Men (ill. esemnyek) hozzrendelse az ikonhoz. c) A program FFormjnak elrejtse. (ha szksges)D2 D3 D4 Forrs: Sebestyn dm Utols mdosts: 1999. mjus 31.

A program ikonjnak hozzadsa a System Tray-hez 1. A feladat megoldsa a Shell_NotifyIcon(dwMessage, lpData) Windows API fggvny hasznlatval trtnik. A fggvny els paramtere egy zenet, amely meghatrozza, hogy mit tesznk az ikonnal, a msodik pedig egy az ikon adatstruktrjra vonatkoz mutat (pointer). Mivel ez az adatstruktra a ShellAPI unitban van deklarlva (TNotifyIconData), ezrt azt bele kell foglalni a uses klauzulba. 2. Ezutn a Form deklarcijnak private rszben ltre kell hozni egy TNotifyIconData tpus vltozt az albbi mdon:private { Private declarations } TrayIcon: TNotifyIconData;

3. Majd a Form On Create esemnyben rendeljk hozz a megfelel rtkeket ehhez a vltozhoz s hvjuk meg a Shell_NotifyIcon API fggvnyt.procedure TForm1.FormCreate(Sender: TObject); begin with TrayIcon do begin cbSize := SizeOf(TrayIcon); Wnd := Handle; {A FForm Handle-je } uId := 100; uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; uCallBackMessage := WM_USER + 1;{A Formnak kldtt zenet azonostja} hIcon := Application.Icon.Handle; {A megjelentend ikon Handle-je} szTip := 'Az ikonhoz tartoz tipp...'; {Az ikonhoz tartoz tipp} end; Shell_NotifyIcon(NIM_ADD, @TrayIcon); {A fggvny meghvsa} end;

A megadott rtkek a ksbbiekben a NIM_MODIFY zenettel vltoztathatk meg. Egyszeren rendeljk hozz az j rtkeket a vltozhoz s hvjuk meg a fggvnyt. Pldul gy:StrPCopy(TrayIcon.szTip, Application.Title); Shell_NotifyIcon(NIM_MODIFY, @TrayIcon);

FONTOS! Az alkalmazs bezrsakor ne feledjk el a NIM_DELETE zenettel eltvoltani az ikont a System Tray-bl.Shell_NotifyIcon(NIM_DELETE, @TrayIcon);

Men hozzrendelse a SysTray ikonhoz Ahhoz, hogy az alkalmazst kezelni tudjuk magbl a ltrehozott ikonbl az ikonhoz hozz kell rendelni egy ment (vagy egyb esemnyeket). 1. Elszr helyezz a Formra egy elugr ment (TPopupMenu) s hatrozd meg az egyes menpontok OnClick esemnyhez tartoz eljrsokat (pl. kilps, a Form elrejtse ill. mutatsa). 2. Ezt kveten a WndProc eljrs fellrsval elrjk, hogy a SysTray-ben elhelyezked ikon "vlaszoljon" az ltalunk meghatrozott zenetekre.private { Private declarations } procedure WndProc(var Msg: TMessage); override;

.

.

.

procedure TForm1.WndProc(var Msg: TMessage); var p : TPoint; begin case Msg.Msg of WM_USER + 1 : //az zenet azonostja case Msg.LParam of WM_RBUTTONDOWN : //kattints az egr jobb gombjval begin GetCursorPos(p); //a kurzor pozcija a kattintskor PopupMenu1.Popup(p.x,p.y); //a men kinyitsa end; WM_LBUTTONDBLCLK : //bal dupla-kattints begin Form1.Show; end; WM_LBUTTONDOWN : //kattints az egr bal gombjval; end; end; inherited; //a le nem kezelt zenetek elintztetse end;

Egyb hasznos dolgok 1. Ha azt akarjuk elrni, hogy a FForm a program indulsnl teljesen rejtve maradjon, akkor a Project fjlban (az Application.Run eltt) lltsuk be a kvetkez alkalmazs-tulajdonsgot:Application.ShowMainForm:= False;

2. Abban az esetben, ha nem szeretnnk a FForm (rendszergombokkal trtn) bezrsakor kilpni a programbl, csupn a System Tray-be kvnjuk "ledobni", akkor a Form OnClose esemnyt az albbiak szerint kell meghatroznunk:procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:= caNone; Form1.Hide; end;

A program bezrst ilyenkor a SysTray-ikon egy menparancsval rdemes megoldani. Mgpedig a kvetkez mdon:procedure TForm1.meExitClick(Sender: TObject); begin Shell_NotifyIcon(NIM_DELETE, @TrayIcon); Application.ProcessMessages; Application.Terminate; end;

Kapcsold komponensekTCoolTray Icon v2.1.1 (183 kb) - Egy SysTray komponens

A Windows System knyvtr helynek megllaptsaD1 D2 D3 D4 Forrs: Windows API Help Utols mdosts: 1999. jnius 7.

A

Windows System knyvtrnak helyt a GetSystemDirectory fggvnnyel tudjuk megllaptani. (Ennek a fggvnynek a DOS-os

megfelelje a GetSystemDir, amelyet azonban nem hasznlhatunk windowsos alkalmazsban.) Az albbi fggvny visszaadja a Windows System knyvtrnak helyt (elrsi tjt):function FindSystemDir : string; var pSystemDir : array [0..255] of Char; sSystemDir : string; begin GetSystemDirectory (pSystemDir, 255); sSystemDir := StrPas (pSystemDir); Result := sSystemDir ; end;

A StartMen elrsi tjnak megllaptsaD2 D3 D4 Forrs: Sting Utols mdosts: 1999. jnius 7.

A kvetkez fggvny

visszaadja a StartMen knyvtrnak elrsi tjt:uses Windows, ShlObj; function GetStartMenuPath: string; var P : PItemIDList; C : array[0..Max_Path] of Char; begin SHGetSpecialFolderLocation(hInstance, csidl_StartMenu, P); SHGetPathFromIDList(P, @C); GetStartMenuPath:=C; end;

Az A:\ meghajtban lv lemez formzsa A Shell32.dll-ben van egy nem dokumentlt API fggvny, nevezetesen a SHFormatDrive, amely megnyitja a 3,5'' lemez (A:\) formzsa prbeszdablakot. Az albbi plda ennek mkdst mutatja be:D2 D3 D4 Forrs: David Ku Utols mdosts: 1999. jnius 8. implementation {$R *.DFM} const SHFMT_ID_DEFAULT = $FFFF; // Formzsi tulajdonsgok SHFMT_OPT_QUICKFORMAT = $0000; SHFMT_OPT_FULL = $0001; SHFMT_OPT_SYSONLY = $0002; // Hiba kdok SHFMT_ERROR = $FFFFFFFF; SHFMT_CANCEL = $FFFFFFFE; SHFMT_NOFORMAT = $FFFFFFFD;

function SHFormatDrive(Handle:HWND; Drive, ID, Options:Word): LongInt; stdcall; external 'shell32.dll' name 'SHFormatDrive' procedure TForm1.btnFormatDiskClick(Sender : TObject); var retCode: LongInt;

begin retCode:= SHFormatDrive(Handle, 0, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT); if retCode < 0 then ShowMessage('A lemez nem lett formzva.'); end;

A Vezrlpult klnbz prbeszdpaneljeinek megnyitsaD2 D3 D4 Forrs: Sebestyn dm Utols mdosts: 1999. jnius 18.

A vezrlpult (Control Panel) egyes prbeszdpaneljeinek megnyitshoz a WinExec() API fggvny segtsgvel meg kell hvni a control.exe alkalmazst, paramterknt tadva neki a megfelel prbeszdpanel fjlnevt (vagy konstanst) s ha a panelen tbb oldal ("fl") van, akkor a kvnt oldal szmt (0 bzis). Pldnak okrt a Kperny tulajdonsgai prbeszdpanel Httr oldalt az albbi mdon lehet megnyitni:WinExec('CONTROL.EXE desk.cpl,,0', sw_ShowNormal);

A kpernykml oldalt pedig a kvetkezkppen: A windows krnyezet belltst szolgl fjlok (tulajdonkppen DLL-ek) a Windows\System knyvtrban tallhatk CPL kiterjesztssel. Azonban van egy-kt prbeszdablak (vagy knyvtr), amelyet csak konstansal (a nevvel) lehet meghvni. Ilyen pldul a nyomtatk, vagy a teleptett bettpusok oldal. Ezeknl nem kell (nem lehet) tadni a msodik paramtert. Pldul:{Teleptett nyomtatk} WinExec('CONTROL.EXE PRINTERS', sw_ShowNormal); {Teleptett bettpusok} WinExec('CONTROL.EXE FONTS', sw_ShowNormal); WinExec('CONTROL.EXE desk.cpl,,1', sw_ShowNormal);

A FONTOSABB PRBESZDPANELEKMegnevezs Dtum s id belltsa Idzna megadsa Programok teleptse, eltvoltsa Windows telepts mdostsa Windows indtlemez ltrehozsa Kperny tulajdonsgai - Httr Kperny tulajdonsgai - Kpernykml Kperny tulajdonsgai - Megjelens Kperny felbonts belltsa Kisegt lehetsgek Egr tulajdonsgai Asztal tmk belltsa Trcszsi tulajdonsgok Internet (IE) tulajdonsgok Terleti belltsok tulajdonsgai Jtkvezrlk (joystick) belltsai Multimdia - Hang tulajdonsgok Multimdia - Video tulajdonsgok Multimdia - MIDI Tulajdonsgok Multimdia - CD Zene Tulajdonsgok Multimdia - Eszkzk, Illesztprogramok Energiagazdlkods tulajdonsgai Rendszer tulajdonsgai Rendszer - Eszkzkezelk Rendszer - Teljestmny Billentyzet tulajdonsgai Nyomtatk Teleptett bettpusok Els paramter timedate.cpl timedate.cpl appwiz.cpl appwiz.cpl appwiz.cpl desk.cpl desk.cpl desk.cpl desk.cpl access.cpl main.cpl themes.cpl telephon.cpl inetcpl.cpl intl.cpl joy.cpl mmsys.cpl mmsys.cpl mmsys.cpl mmsys.cpl mmsys.cpl powercfg.cpl sysdm.cpl sysdm.cpl sysdm.cpl KEYBOARD PRINTERS FONTS Msodik paramter 0 1 0 vagy 1 2 3 0 1 2 3 0 0 0 0 0 0 0 0 1 2 3 4 0 0 1 3 NINCS NINCS NINCS

Caf DELPHI 1998-1999 Sebestyn dm

Az aktulis kpernyfelbonts megllaptsaD1 D2 D3 D4 Forrs: Lewis Howell (kiegsztve) Utols mdosts: 1999. augusztus 8.

1. Az aktulis kpernyfelbonts megllaptshoz a GetSystemMetrics() Windows API fggvnyt hasznlhatjuk. Ez a fggvny a paramtertl fggen a Windows klnbz mretbelltsaival illetve egyb konfiurcis informcikkal tr vissza. Jelen esetben az albbi ngy paramter lehet segtsgnkre a feladat megoldsban: SM_CXSCREEN - a teljes kperny szlessgt adja vissza pixelben. SM_CYSCREEN - a teljes kperny magassgt adja vissza pixelben. SM_CXFULLSCREEN - egy teljes mret ablak kliens-terletnek teljes szlessge pixelben. SM_CYFULLSCREEN - egy teljes mret ablak kliens-terletnek teljes magassgt adja vissza pixelben. (az SM_CYSCREEN rtkbl levonva az ablakok fejlcmagassga s a Taskbar magassga) 2. Lssunk egy pldt a fenti fggvny alkalmazsra: Az albbi eljrs

egy gomb lenyomsra egy zenetablakban megjelenti a kpernyfelbonts aktulis rtkeit s egy teljes mret ablak kliensterletnek maximlis rtkt.procedure TForm1.Button1Click(Sender: TObject); var scrWidth, scrHeight : Integer; mclWidth, mclHeight : Integer; begin scrWidth := GetSystemMetrics(SM_CXSCREEN); scrHeight := GetSystemMetrics(SM_CYSCREEN); mclWidth := GetSystemMetrics(SM_CXFULLSCREEN); mclHeight := GetSystemMetrics(SM_CYFULLSCREEN); ShowMessage('Kpernyfelbonts: ('+ IntToStr(scrWidth)+ 'x'+ IntToStr(scrHeight)+ ')'+ #13 + 'Max. kliensterlet: ('+ IntToStr(mclWidth)+ 'x'+ IntToStr(mclHeight)+ ')'); end;

A knytrvlaszt prbeszdablak hasznlata Az albbi plda bemutatja, hogy hogyan lehet hasznlni a Windows knytrvlaszt prbeszdablakjt az SHBrowseForFolder Win32API fggvny segtsgvel.D2 D3 D4 Forrs: jvscalco Utols mdosts: 1999. augusztus 21. { . . . } implementation uses shlobj; {$R *.DFM} function ShellShowDirs ( AHandle : var BrowsingInfo : TBrowseInfo ; DirPath : String ; FolderName : string ; pItemId : PItemIDList; begin DirPath := '' ; FolderName := '' ; DirPath := StringOfChar(' ', MAX_PATH); FolderName := StringOfChar (' ' , MAX_PATH) ; // A prbeszdablak tulajdonsgai BrowsingInfo.hwndOwner := AHandle ; // self.Handle ; BrowsingInfo.pszDisplayName := PChar(FolderName) ; BrowsingInfo.lpszTitle := PAnsiChar ('Vlassz egy knyvtrat!'); BrowsingInfo.ulFlags := BIF_RETURNONLYFSDIRS and BIF_DONTGOBELOWDOMAIN ; BrowsingInfo.pidlRoot := nil ; BrowsingInfo.lpfn := nil ; // A prbeszdablak megjelentse pItemID := SHBrowseForFolderA( BrowsingInfo ); // A vlasztott knyvtr megllaptsa SHGetPathFromIDList(pItemID, PChar(DirPath)); HWND ): string ; // // // // BrowsingInfo; char DirPath[MAX_PATH]; char FolderName[MAX_PATH]; LPITEMIDLIST; ItemID;

result := PChar(DirPath) ; // pItemId ltal lefoglalt memria felszabadtsa GlobalFreePtr(pItemID); end; procedure TForm1.SelDirBtnClick(Sender: TObject); var sDir : string ; begin sDir := ShellShowDirs (self.Handle); if ( length(sDir) > 0 ) then ShowMessage ('A vlasztott knyvtr:'+ #13 + sDir ) else ShowMessage ('Nem vlasztott knyvtrat.') ;

end ;

Kapcsold komponensekTBrowseFolder Component 2.2 - Egy hasznos kis komponens, ami megknnyti a Windows knyvtrvlaszt prbeszdablaknak kezelst. (Todd Fast) ClipBoard (Vglap)

Kivgs, Msols, Beilleszts (Cut, Copy, Paste) 1. Ha csak egyes, adatokkal rendelkez komponensekre hasznljuk, akkor a vglapkezels legegyszerbb mdja, a CopyToClipboard, CutToClipboard and PasteFromClipboard eljrsok hasznlata. Pldul gy:D2, D3, D4 Forrs: Brad Evans Utols mdosts: 1998. november 26. procedure TForm1.Button1Click(Sender: TObject); begin Memo1.CopyToClipboard //PasteFomClipboard end;

2. De ha belegondolunk, hogy egy Form-on szmtalan komponens lehet, s mondjuk egy menbl akarjuk meghvni a vglap eljrsokat, akkor elg nagy munkba tellik, amg meghatrozzuk, hogy mikor melyik komponens tartalmt msolja a vglapra. Ha ilyen esetben az ppen fkusszal rendelkez komponens tartalmt adjuk meg msolandnak s az adott komponens nem rendelkezik CopyToClipboard eljrrssal, akkor a program futsban hiba ll be az eljrs meghvsakor. Szerencsre van egy nagyon egyszer megoldsa a bonyolultnak tn problmra: Egyszeren egy WM_CUT, WM_COPY illetve WM_PASTE zenetet kell kldeni az alkalmazsnak az albbiak szerint s az majd eldnti, hogy melyik a fkusszal rendelkez komponens, ha pedig az adott komponensnek nincsen CopyToClipboard eljrsa, akkor egyszeren mellzi azt. Nem okoz hibt a program futsban.procedure TfrmMain.CopyClick(Sender: TObject); begin SendMessage(ActiveControl.Handle, WM_COPY, 0, 0); end; procedure TfrmMain.PasteClick(Sender: TObject); begin SendMessage(ActiveControl.Handle, WM_PASTE, 0, 0);

end; procedure TfrmMain.CutClick(Sender: TObject); begin SendMessage(ActiveControl.Handle, WM_CUT, 0, 0); end; {!!! MDI alkalmazsoknl az 'ActiveControl.Handle'-t le kell cserlni 'ActiveMDIChild.ActiveControl.Handle'-re !!!}

Visszavons (Undo) A legutbbi utastsok visszavonsa (Undo) hasonlan egyszer feladat, mint a Kivgs, Msols vagy a Beilleszts (Cut, Copy, Paste) utastsok. Az egyetlen tbbletmunkt az jelenti, hogy a parancs kiadsa eltt meg kell vizsglni, hogy van-e egyltaln visszavonhat utasts.D2, D3, D4 Forrs: Brad Evans Utols mdosts: 1998. november 26.

1. A visszavons (Undo) parancs kiadst az albbi kdnak a kvnt kontroll (pl. Szerkeszts/Visszavons menpont) OnClick esemnyhez val hozzrendelsvel tudjuk elrni:procedure TForm.mniUndoClick(Sender: TObject); begin SendMessage(ActiveControl.Handle, EM_Undo, 0, 0); end;

2. Ahhoz, hogy pldul a Szerkeszts men Visszavons menpontjt letiltsuk illetve jra engedlyezzk attl fggen, hogy van-e visszavonhat utasts, az albbi kdot kell a Szerkeszts men OnClick esemnyhez rendelni. A WinAPI zenet a men legrdlse eltt megvizsglja, hogy van-e visszavonhat parancs.procedure TForm.mnuEditClick(Sender: TObject); begin {Mieltt a men legrdl letiltja illetve engedlyezi a visszavons menupontot.} mniUndo.Enabled := SendMessage(ActiveControl.Handle,EM_CanUndo, 0, 0); end;

A Form tartalmnak vglapra msolsaD1, D2, D3, D4 Forrs: Dirk Paessler Utols mdosts: 1998. december 25.

Egy

Form tartalmt (kpt) az albbi eljrssal lehet a vglapra msolni:implementation {$R *.DFM} uses clipbrd; procedure TForm1.Button1Click(Sender: TObject);

var bitmap:tbitmap; begin bitmap:=tbitmap.create; bitmap.width:=clientwidth; bitmap.height:=clientheight; try with bitmap.Canvas do CopyRect (clientrect,canvas,clientrect); clipboard.assign(bitmap); finally bitmap.free; end; end;

Kivgs, Msols, Beilleszts (Cut, Copy, Paste)D1, D2, D3, D4 Forrs: David S. Becker Utols mdosts: 1998. november 26.

Prbld ki ezt a fggvnyt:var ErrorMode: Word;

function DiskExists(Drive: Char): Boolean;

begin Drive := UpCase(Drive); { Megvizsglja, hogy a meghajt betjele rvnyes-e } if not (Drive in ['A'..'Z']) then raise EConvertError.Create('Not a valid drive letter'); { Kikapcsolja a kritikus hibkat } ErrorMode := SetErrorMode(SEM_FailCriticalErrors); try Application.ProcessMessages; Result := (DiskSize(Ord(Drive) - Ord('A') + 1) -1); finally { Visszalltja az eredeti hibamdot } SetErrorMode(ErrorMode); Application.ProcessMessages; end; end;

Kivgs, Msols, Beilleszts (Cut, Copy, Paste)D1, D2, D3, D4 Forrs: David S. Becker Utols mdosts: 1998. november 26.

Prbld ki ezt a fggvnyt:function DiskExists(Drive: Char): Boolean; var ErrorMode: Word;

begin Drive := UpCase(Drive); { Megvizsglja, hogy a meghajt betjele rvnyes-e } if not (Drive in ['A'..'Z']) then raise EConvertError.Create('Not a valid drive letter'); { Kikapcsolja a kritikus hibkat }

ErrorMode := SetErrorMode(SEM_FailCriticalErrors); try Application.ProcessMessages; Result := (DiskSize(Ord(Drive) - Ord('A') + 1) -1); finally { Visszalltja az eredeti hibamdot } SetErrorMode(ErrorMode); Application.ProcessMessages; end; end; Adatbzisok

Sznes cellk a DBGrid-ben Az albbi pldban a DBGrid OnDrawColumnCell esemnyvel a felttel(ek)nek megfelel cellkat fogjuk ms sznnel jellni.D2 D3 D4 Forrs: Ed Hillmann Utols mdosts: 1999. mjus 23.

1. Hozz ltre egy j Formot. Helyezz r egy TTable, egy DataSource s egy DBGrid komponenst. 2. A TTable mutasson az EMPLOYEE.DB adatbzisra a DBDEMOS 'adatbzis-csoportban'. A DataSource mutasson a TTable-re, a DBGrid pedig a DataSource-re. 3. Msold az albbi kdot a DBGrid OnDrawColumnCell esemnybe:procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var begin holdColor := DBGrid1.Canvas.Brush.Color; {eltrolja az eredeti sznt} if Column.FieldName = 'EmpNo' then {csak az EmpNo oszlopban} if (Column.Field.AsInteger mod 2 0) then {ha pratlan} begin DBGrid1.Canvas.Brush.Color := clGreen; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); DBGrid1.Canvas.Brush.Color := holdColor; end; end; holdColor: TColor;

Teht a fnti eljrs az EmpNo oszlopban a pratlan rtket tartalmaz cellkat zldre 'festi'. Ennek sorn a TCustomDBGrid komponensben (amely a TDBGrid-nek a 'szlje') meghatrozott DefaultDrawColumnCell eljrst hasznlja. Drag and Drop technika DBGridben Ez a plda egy komponens s egy mintaalkalmazs elksztsn keresztl bemutatja, hogy hogyan lehet kt DBGrid tetszleges mezi kztt alkalmazni a Drag & Drop (Fogd s Vidd) technikt. (A plda a Delphi 3-as s 4-es verzii alatt mkdik, de egyes kisebb vltoztatsokkal hasznlhat a Delphi 1-es s 2-es verziival is.)D3 D4 Forrs: Borland FAQ Utols mdosts: 1999. mrcius 19.

1. Kszts egy j Unit-ot (File/New/Unit). A lenti MyDBGrid unit szvegt msold bele s mentsd el MyDBGrid.pas nven. Ez lesz az j DBGrid komponens. 2. Most installld az j komponenst: Component/Install Component. Vlts t az 'Into New Package' flre. A Unit neve szerkesztmezbe hvd be a MyDBGrid.pas fjlt. Nevezd el az j komponens-csomagot 'MyPackage.dpk'-nak. Nyomd meg az igen gombot, amikor a Delphi kzli, hogy az j csomag installlva lesz, majd az OK-t, amikor jelzi, hogy a 'VCL30.DPL' szksges hozz. Zrd be a csomag-szerkesztt s mentsd el a komponens-csomagot. 3. Kszts egy j alkalmazst: File/New Application. Kattints jobb gombbal a Form-ra (Form1) s vlaszd a gyorsmenbl a 'View As Text' menpontot. A lenti GridU1 form szveges forrst msold be a Form1 forrsba. Most kattints jobb gombbal a Form1 forrsba s vlaszd ki a 'View As Form' menpontot. Eltarthat egy rvid ideig mg visszavlt Form nzetre mert kzben meg kell nyitnia az adatbzis tblkat is. Ezutn a lenti GridU1 Unit szvegt msold be az 'Unit1'-be. 4. Mentsd el az alkalmazst: File/Save Project As. A unitot nevezd el 'GridU1.pas'-nak, az alkalmazst pedig 'GridProj.dpr'-nek. 5. Futtasd az alkalmazst s ha minden igaz, mris mkdni fog a Drag&Drop technika a kt DBGrid mezi kztt.----------------The MyDBGrid unit ----------------unit MyDBGrid; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids; type TMyDBGrid = class(TDBGrid) private { Private declarations } FOnMouseDown: TMouseEvent; protected { Protected declarations } procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; published { Published declarations } property Row; property OnMouseDown read FOnMouseDown write FOnMouseDown; end; procedure Register;

implementation procedure TMyDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y); inherited MouseDown(Button, Shift, X, Y); end; procedure Register; begin RegisterComponents('Samples', [TMyDBGrid]); end; end. --------------The GridU1 unit --------------unit GridU1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, Grids, DBGrids, MyDBGrid, StdCtrls; type TForm1 = class(TForm) MyDBGrid1: TMyDBGrid; Table1: TTable; DataSource1: TDataSource; Table2: TTable; DataSource2: TDataSource; MyDBGrid2: TMyDBGrid; procedure MyDBGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MyDBGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure MyDBGrid1DragDrop(Sender, Source: TObject; X, Y: Integer); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} var SGC : TGridCoord; procedure TForm1.MyDBGrid1MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var DG : TMyDBGrid; begin DG := Sender as TMyDBGrid; SGC := DG.MouseCoord(X,Y); if (SGC.X > 0) and (SGC.Y > 0) then (Sender as TMyDBGrid).BeginDrag(False); end; procedure TForm1.MyDBGrid1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var GC : TGridCoord; begin GC := (Sender as TMyDBGrid).MouseCoord(X,Y); Accept := Source is TMyDBGrid and (GC.X > 0) and (GC.Y > 0); end; procedure TForm1.MyDBGrid1DragDrop(Sender, Source: TObject; X, Y: Integer); var DG : TMyDBGrid; GC : TGridCoord; CurRow : Integer; begin DG := Sender as TMyDBGrid; GC := DG.MouseCoord(X,Y); with DG.DataSource.DataSet do begin with (Source as TMyDBGrid).DataSource.DataSet do Caption := 'You dragged "'+Fields[SGC.X-1].AsString+'"'; DisableControls; CurRow := DG.Row; MoveBy(GC.Y-CurRow); Caption := Caption+' to "'+Fields[GC.X-1].AsString+'"'; MoveBy(CurRow-GC.Y); EnableControls; end; end; end. --------------The GridU1 form --------------object Form1: TForm1 Left = 200 Top = 108 Width = 544 Height = 437 Caption = 'Form1' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] PixelsPerInch = 96 TextHeight = 13 object MyDBGrid1: TMyDBGrid

Left = 8 Top = 8 Width = 521 Height = 193 DataSource = DataSource1 Row = 1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'MS Sans Serif' TitleFont.Style = [] OnDragDrop = MyDBGrid1DragDrop OnDragOver = MyDBGrid1DragOver OnMouseDown = MyDBGrid1MouseDown end object MyDBGrid2: TMyDBGrid Left = 7 Top = 208 Width = 521 Height = 193 DataSource = DataSource2 Row = 1 TabOrder = 1 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'MS Sans Serif' TitleFont.Style = [] OnDragDrop = MyDBGrid1DragDrop OnDragOver = MyDBGrid1DragOver OnMouseDown = MyDBGrid1MouseDown end object Table1: TTable Active = True DatabaseName = 'DBDEMOS' TableName = 'ORDERS' Left = 104 Top = 48 end object DataSource1: TDataSource DataSet = Table1 Left = 136 Top = 48 end object Table2: TTable Active = True DatabaseName = 'DBDEMOS' TableName = 'CUSTOMER' Left = 104 Top = 240 end object DataSource2: TDataSource DataSet = Table2 Left = 136 Top = 240 end end

Srlt vagy hinyz DBase indexllomny (MDX) kijavtsa D1 Forrs: Zsdely Gbor Utols mdosts: 1999. jnius 17. A Delphi1-ben a DBase file-ok sszetett indexllomnya csak MDX lehet (TTable osztly TableType property: ttDBase). Ha hinyzik (vagy srlt) az MDX file, akkor a DBF file nem nyithat meg. Vagy ha jra kell indexelni a DBF file-t elbb trlni kellene az indexeket (csak a msodlagosakat lehet) s utna AddIndex(...)-el jra ltrehozni. A problma alapja, hogy a DBF file fejlcbe be van jegyezve, hogy ltezik hozz index. Ez a problma a kvetkez mdon oldhat meg: 1. Elszr kitrljk az indexfile-t (MDX):DeleteFile(Konyvtar+'FILE.MDX');

2. Utna a lenti eljrs segtsgvel a DBF file fejlcben fellrunk egy byte-ot, ezzel elrjk, hogy ne keresse megnyitskor az indexet:procedure TForm1.RemoveMDXByte(dbFile: String); { Bemen paramter: a srlt .DBF fjl neve(tvonala) } { Megpatcheli a .DBF fejlcet, ezzel elri, hogy ne keresse } { megnyitskor az indexet } const Value: Byte = 0; var F: File of byte; begin AssignFile(F, dbFile); Reset(F); Seek(F, 28); { itt van az index bejegyezve } Write(F, Value); CloseFile(F); end; // pl. RemoveMDXByte(Konyvtar+'KEPLET.DBF');

3. Mindezek utn mr nyugodtan indexelhetnk:Table1.AddIndex('KOD', 'KOD', []); Fjlkezels

Utols hozzfrsD2, D3, D4 Forrs: Jon Erik Oterhals Utols mdosts: 1998. december 17.

A fjl utols hozzfrsnek (hasznlatnak) idpontjt az albbi eljrssal tudod megjelenteni. (A krdses fjl nevt (elrsi tjt) az AnyFile.FIL helyre kell behelyettesteni.)procedure TForm1.Button1Click(Sender: TObject); var FileHandle : THandle; LocalFileTime : TFileTime; DosFileTime : DWORD; LastAccessedTime : TDateTime; FindData : TWin32FindData; begin FileHandle := FindFirstFile('AnyFile.FIL', FindData);

if FileHandle INVALID_HANDLE_VALUE then begin Windows.FindClose(Handle); if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then begin FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); FileTimeToDosDateTime(LocalFileTime, LongRec(DosFileTime).Hi,LongRec(DosFileTime).Lo); LastAccessedTime := FileDateToDateTime(DosFileTime); Label1.Caption := DateTimeToStr(LastAccessedTime); end; end;

end; Fjlok msolsa delphi programblD2, D3, D4 Forrs: Borland FAQ Utols mdosts: 1998. december 25.

Hrom megolds: 1. Az els File Stram-et hasznl:Procedure FileCopy( Const sourcefilename, targetfilename: String ); Var S, T: TFileStream; Begin S := TFileStream.Create( sourcefilename, fmOpenRead ); try T := TFileStream.Create( targetfilename, fmOpenWrite or fmCreate ); try T.CopyFrom(S, S.Size ) ; finally T.Free; end; finally S.Free; end; End;

2. A msodik memriablokkokat olvas s r.procedure FileCopy(const FromFile, ToFile: string); var FromF, ToF: file; NumRead, NumWritten: Word; Buf: array[1..2048] of Char;

begin AssignFile(FromF, FromFile); Reset(FromF, 1); { Rekord nagysga = 1 } AssignFile(ToF, ToFile); { Megnyitja a kimeneti fjlt } Rewrite(ToF, 1); { Rekord nagysga = 1 } repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten NumRead); CloseFile(FromF); CloseFile(ToF); end;

3. A harmadik pedig az LZCopy-t hasznljauses LZExpand; ... procedure CopyFile(FromFileName, ToFileName: string); var FromFile, ToFile: File; begin AssignFile(FromFile, FromFileName); {Assign FromFile to FromFileName} AssignFile(ToFile, ToFileName); {Assign ToFile to ToFileName} Reset(FromFile); {Open file for input } try Rewrite(ToFile); { Create file for output } try { ha negatv rtk rkezik vissza a fjl msolsakor } { elindtja a kivtelkezelt } if LZCopy(TFileRec(FromFile).Handle, TFileRec(ToFile).Handle) < 0 then raise EInOutError.Create('Error using LZCopy') finally CloseFile(ToFile); { Bezrja a ToFile-t } end; finally CloseFile(FromFile); { Bezrja a FromFile-t } end; end;

Fjlok trlse a kukbaD2, D3, D4 Forrs: Brthzi Andrs Utols mdosts: 1998. december 17.

Az alacsony szint trlseknl - ilyet vgez a DeleteFile eljrs is - a file letrldik. A kvetkez kdrszlet segtsgvel azonban, egy API hvst hasznlva a kukba helyezdik t a file. Egy file trlshez egyszeren meg kell hvni a DeleteFileWithUndo() eljrst, paramternek megadva a file nevt. Amennyiben a mvelet sikeres volt, az eljrs TRUE-t ad vissza...... uses ShellAPI; ... function DeleteFileWithUndo( sFileName : string ): boolean; var

fos : TSHFileOpStruct; begin FillChar( fos, SizeOf( fos ), 0 ); with fos do begin wFunc pFrom := FO_DELETE; := PChar( sFileName );

fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT; end; Result := ( 0 = ShFileOperation( fos ) );

End; Drag & Drop hasznlata Win95/98 IntzvelD2, D3, D4 Forrs: Reid Roman Utols mdosts: 1998. december 25.

Egy kis pldaprogram: (megszmolja, hogy hny fjl lett a Form-ra 'dobva' s kirja a fjlok neveit)unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } procedure FileIsDropped ( var Msg : TMessage ) ; Message WM_DropFiles ; public { Public declarations } end;

var Form1: TForm1; implementation uses shellapi; {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles( Handle,True ) ; end; procedure TForm1.FileIsDropped ( var Msg : TMessage ) ; var hDrop : THandle ; fName : array[0..254] of char ; NumberOfFiles : integer ; fCounter : integer ; Names : string ; begin hDrop := Msg.WParam ; NumberOfFiles := DragQueryFile(hDrop,-1,fName,254); Names := '' ; for fCounter := 1 to NumberOfFiles do begin DragQueryFile(hDrop,fCounter,fName,254); // Ez adja vissza a fjlok neveit Names := Names + #13#10 + fName ; end ;

ShowMessage('Droped '+IntToStr(NumberOfFiles) + ' Files : ' + Names ); DragFinish ( hDrop); end ;

end.

A hossz fjlnv talaktsa rvid fjlnvv (s vissza) D2 D3 D4 Forrs: DynaSoft Utols mdosts: 1999. mjus 24. Az albbi fggvnyekkel a hossz fjlneveket alakthatod t rvid fjlnvv, valamint a rvid fjlnevet vissza a hossz fjlnv mdba. Pl.: "Long File Name.pas" "longfi~1.pas" 1. Hossz fjlnvbl rvid fjlnv:Function GetShortFileName(Const FileName : String) : String; var aTmp: array[0..255] of char; begin if GetShortPathName(PChar(FileName),aTmp,Sizeof(aTmp)-1)=0 then Result:= FileName else Result:=StrPas(aTmp); end;

2. Rvid fjlnvbl hossz fjlnv:Function GetLongFileName(Const FileName : String) : String; var aInfo: TSHFileInfo; begin if SHGetFileInfo(PChar(FileName),0,aInfo,Sizeof(aInfo),SHGFI_DISPLAYNAME)0 then Result:= String(aInfo.szDisplayName) else Result:= FileName; end;

Egy knyvtr teljes mretnek megllaptsa Az albbi fggvny visszaadja a paramterknt megadott knyvtrban tallhat (norml, rendszer s rejtett) fjlok sszmrett. A rekurzv algoritmus megvizsglja a knyvtrban tallhat sszes alknyvtrat is. A visszatr rtket a fggvny a DirBytes vltozban trolja el lefuts utn.D2 D3 D4 Forrs: Roger Fylling Utols mdosts: 1999. mjus 24. uses FileCtrl; ... var DirBytes : integer; ... function TForm1.DirSize(Dir:string):integer; var SearchRec : TSearchRec; Separator : string; begin if Copy(Dir,Length(Dir),1)='\' then Separator := '' else Separator := '\'; if FindFirst(Dir+Separator+'*.*',faAnyFile,SearchRec) = 0 then begin

if FileExists(Dir+Separator+SearchRec.Name) then begin DirBytes := DirBytes + SearchRec.Size; {Memo1.Lines.Add(Dir+Separator+SearchRec.Name);} end else if DirectoryExists(Dir+Separator+SearchRec.Name) then begin if (SearchRec.Name'.') and (SearchRec.Name'..') then begin DirSize(Dir+Separator+SearchRec.Name); end; end; while FindNext(SearchRec) = 0 do begin if FileExists(Dir+Separator+SearchRec.Name) then begin DirBytes := DirBytes + SearchRec.Size; {Memo1.Lines.Add(Dir+Separator+SearchRec.Name);} end else if DirectoryExists(Dir+Separator+SearchRec.Name) then begin if (SearchRec.Name'.') and (SearchRec.Name'..') then begin DirSize(Dir+Separator+SearchRec.Name); end; end; end; end; FindClose(SearchRec); end;

Egymsba gyazott knyvtrak ltrehozsa 1. Az albbi eljrssal knnyen megoldhat az egymsba gyazott knyvtrak (knyvtrak s alknyvtrak) egyidej ltrehozsa:D1 D2 D3 D4 Forrs: www.chami.com Utols mdosts: 1999. jnius 11. uses SysUtils, FileCtrl; . . .

procedure MkDirMulti(sPath : string); begin if('\' = sPath[Length(sPath)])then begin sPath := Copy(sPath, 1, Length(sPath)-1); end; if( ( Length( sPath ) < 3 ) or FileCtrl.DirectoryExists(sPath) )then begin Exit; end; MkDirMulti(SysUtils.ExtractFilePath(sPath ) ); try System.MkDir( sPath ); except { kivtelkezels } end; end;

2. Egy plda a hasznlatra:procedure TForm1.Button1Click(Sender: TObject); begin MkDirMulti('c:\temp\one\two\three\four' ); end;

Knyvtrak msolsa s thelyezse Egy knyvtrat s teljes tartalmt az albbi mdon lehet tmsolni egy adott helyre:D3 D4 Forrs: Andre Heino Artus Utols mdosts: 1999. jlius 4. implementation uses ShellAPI; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var FOS :TSHFileOpStruct; begin with FOS do begin Wnd := Self.Handle; wFunc := FO_COPY; //Msols pFrom := 'c:\idapi\*.*'; //Honnan, mely fjlokat? pTo := 'c:\proba'; //Hov? (clknyvtr) fFlags := FOF_NoConfirmMkDir; //Krds nlkl ltrehozza end; //az j (cl)knyvtrat. SHFileOperation(FOS); end;

Ha a knyvtrat s tartalmt nem msolni, hanem thelyezni szeretnd, akkor a FO_COPY helyett FO_MOVE belltst kell hasznlnod. A program EXE knyvtrnak megllaptsa Nha szksg lehet arra, hogy megllaptsuk, hogy a program EXE-je melyik knyvtrban tallhat. (Pldul, ha az INI fjlt itt helyezzk el a windows knyvtr helyett.)D1 D2 D3 D4 Forrs: www.chami.com Utols mdosts: 1999. augusztus 21.

1. A feladat megoldshoz az albbi funkcit illetve tulajdonsgot hasznlhatjuk: function ExtractFilePath(const FileName: string): string; visszaadja a paramterben megadott fjl elrsi tjbl a meghajt jelt s a knytra(ka)t. Teht lecsapja a vgrl a fjl nevt s kiterjesztst. TApplication.ExeName - visszaadja a futtatott program EXE teljes elrsi tjt, fjlnvvel s kiterjesztssel. 2. Lssunk egy pldt a fentiek hasznlatra:procedure TForm1.Button1Click(Sender: TObject); begin MessageDlg('A program EXE knyvtra:' + #13 + ExtractFilePath( Application.ExeName), mtInformation, [mbOk], 0); end;

Egy fjl tulajdonsgainak megjelentse (Fjlinformcis lap) D3 D4 Forrs: Lewis Howell Utols mdosts: 1999. augusztus 22. 1. Egy fjl tulajdonsgainak a Windows fjlinformcis lapjn trtn megjelentse a ShellExecuteEx() WinAPI fggvny segtsgvel rhet el. A Fggvnynek paramterknt egy TShellExecuteInfo tpus struktrt kell tadni, melyben a 'properties' igvel adjuk meg, hogy a fjlinformcit akarjuk megjelenteni.

2. A lenti plda megjelenti a Megnyits prbeszdablakban (OpenDialog) kivlasztott fjl informcis lapjt.uses ShellAPI; { . . . }

implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var MyShellExecuteInfo : TShellExecuteInfo; FileChr : array [0..MAX_PATH] of Char; begin {a Megnyits prbeszdablak meghvsa} if OpenDialog1.Execute then begin {a TShellExecuteInfo struktra inicializlsa} FillChar(MyShellExecuteInfo, SizeOf(TShellExecuteInfo), #0); StrPCopy (FileChr, OpenDialog1.FileName); {a TShellExecuteInfo struktra feltltse} MyShellExecuteInfo.cbSize := SizeOf(TShellExecuteInfo); MyShellExecuteInfo.lpFile := FileChr; // a fjl vagy knyvtr MyShellExecuteInfo.lpVerb := 'properties'; MyShellExecuteInfo.fMask := SEE_MASK_INVOKEIDLIST; {a ShellExecuteEx fggvny meghvsa} ShellExecuteEx(@MyShellExecuteInfo); end; end;

A gpben tallhat meghajtk fajtja 1. Egy meghajt fajtjt a GetDriveType() WinAPI fggvny segtsgvel tudjuk megllaptani.D3 D4 Forrs: Lewis Howell Utols mdosts: 1999. augusztus 31.

GetDriveType() : WinAPI fggvny, amely visszaadja a meghajt tpust. Az egyetlen paramter, amit t kell adni neki, a meghajt betjele A:\ formtumban. A fggvny visszatrsi rtkei a kvetkezk:

0 : nem llapthat meg 1 : a gykrknyvtr nem ltezik DRIVE_REMOVABLE : a lemez eltvolthat a meghajtbl (floppy) DRIVE_FIXED : a lemez nem tvolthat el a meghajtbl (merevlemez) DRIVE_REMOTE : hlzati meghajt DRIVE_CDROM : CD-ROM meghajt DRIVE_RAMDISK : RAM disk

2. Az albbi plda egy gomb lenyomsra egy ListBox-ban megjelenti a gpen tallhat meghajtk betjelt s fajtjt. A GetDriveType() fggvny ltal visszaadott (meghajt-tpus) rtket egy tbbg szelekcival (case) rtkeljk ki, majd hozzadjuk a ListBox elemeihez.

{

.

.

.

}

type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; { . . . }

procedure TForm1.Button1Click(Sender: TObject); var x : char; DrvType : Integer; DrvLetter, DrvString : String; begin ListBox1.Clear; {25 lehetsges meghajt ... a-z} for x := 'A' to 'Z' do begin DrvLetter := x +':\'; {A meghajt-tpus megllaptsa} DrvType := GetDriveType(pChar(DrvLetter)); {A visszatr rtk elemzse} case DrvType of 0,1 : DrvString := ''; DRIVE_REMOVABLE : DrvString := 'Removable'; DRIVE_FIXED : DrvString := 'Fixed'; DRIVE_REMOTE : DrvString := 'Network'; DRIVE_CDROM : DrvString := 'CD-ROM'; DRIVE_RAMDISK : DrvString := 'RAM disk'; end; {Ha nem res a meghajt tpust jell string, akkor a betjelt s tpust hozzadjuk a ListBox elemeihez} if DrvString '' then Listbox1.Items.Add(DrvLetter + ' = ' + DrvString); end; end; { . . . }

Formok

A Form minimlis s maximlis mretnek meghatrozsaD1 D2 D3 D4 Forrs: Brthzi Andrs Utols mdosts: 1999. mrcius 12.

Ablakmret belltsakor a Windows kld egy zenetet, melyben lekrdezi az ltalad engedlyezett mreteket. Ha ezt az zenetet lekezeled, akkor meghatrozhatod az ablakod maximlizlt mrett, az akkori pozcijt, illetve a nem maximalizlt llapotban a maximlis s a minimlis mrett. Ha azt szeretnd, hogy a felhasznl ne tudja tmretezni a form-ot, akkor e kt utols tulajdonsgot lltsd egyforma mretre. Az zenetet a kvetkezkppen tudod lekezelni:

{...} private { Private declarations } procedure WMGetMinMaxInfo(var MSG: Tmessage); message WM_GetMinMaxInfo; {...} procedure TForm1.WMGetMinMaxInfo(var MSG: Tmessage); begin {Az eredeti esemnykezel meghvsa} inherited; {Az rtkek belltsa} with PMinMaxInfo(MSG.lparam)^ do begin {A maximalizlt mret} with ptMaxSize do begin X := Screen.Width; Y := Screen.Height; end; {Maximalizlt llapotban a pozci} with ptMaxSize do begin X := 0; Y := 0; end; {A minimlis mret} with ptMinTrackSize do begin X := 100; Y := 100; end; {A maximlis mret} with ptMaxTrackSize do begin X := 640; Y := 480; end; end; end;

Kr alak ablak A SetWindowRgn eljrs segtsgvel csinlhatod meg, azonban ez eltt mg ltre kell hoznod egy Region objektumot, aminek olyan az alakja, amilyet szeretnl. Ez tartalmazhat tglalapot, krt s ellipszist, illetve ezeknek a kombincijt. Javallott, hogy a Form.BorderStyle-t lltsd bsNone-ra. Plda egy kr alak ablak ltrehozsra:D1 D2 D3 D4 Forrs: Brthzi Andrs Utols mdosts: 1999. mrcius 12. procedure TForm1.FormCreate(Sender: TObject); var hR: THandle; begin {Legyen ugyanolyan szles az objektumunk, mint amilyen magas} width:=height; {Hozzuk ltre a Region-t} hR := CreateEllipticRgn(0,0,Width+1,Height+1); {lltsuk be az ablak alakjt} SetWindowRgn(Handle,hR,True); end;

(Fejlc nlkli) Form mozgatsa a 'belsejnl fogva'. A legegyszerbb md az, hogy elhiteted a Windows-zal, hogy kattints a form fejlcn trtnt. Ezt a wm_NCHitTest zenet lekezelsvel tudod megtenni, mint azt a kvetkez plda mutatja:D1 D2 D3 D4 Forrs: Brthzi Andrs Utols mdosts: 1999. mrcius 17. {...} private { Private declarations } procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; {...} procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);

begin inherited; // A szlobjektum meghvsa if M.Result = htClient then // A klikkels a kliensterleten trtnt? M.Result := htCaption; // Ha igen, hitessk el a Windows-zal, // hogy az ablak fejlcn trtnt end;

"Stay On Top" Formok Ha olyan Formot akarunk kszteni, amely mindig legfll (a tbbi ablak fltt) marad, akkor hasznlhatjuk a Delphi "FormStyle" tulajdonsgnak "fsStayOnTop" belltst. Azonban, ha futsidben vltoztatjuk meg ezt a tulajdonsgot, az villan egyet amikor az j mdra tvlt.D2 D3 D4 Forrs: ZDTips Utols mdosts: 1999. mrcius 24.

Az albbi API hvs e zavar villans nlkl ri el, hogy a Form legfell maradjon (mindig ltszon):SetWindowPos(Form1.Handle, HWND_TOPMOST, Form1.Left, Form1.Top, Form1.Width, Form1.Height, 0);

Helyettestsd be a "Form1"-et a sajt Formod nevvel s mr ksz is. Ha Form helyzett vissza akarod lltani normlra, akkor azt a kvetkez mdon teheted meg:SetWindowPos(Form1.Handle, HWND_NOTOPMOST, Form1.Left, Form1.Top, Form1.Width, Form1.Height, 0);

A Form(ok) automatikus kperny-felbontshoz arnyostsa D1 D2 D3 D4 Forrs: Marco Cantu Utols mdosts: 1999. mrcius 26. Az alkalmazs Formja, amit a ksztsnl a sajt monitor felbontshoz terveztl sajnos elkpzelhet, hogy alacsonyabb felbonts mellett nagyobb lesz, mint a rendelkezsre ll kpernyterlet, s gy egyes rszei nem fognak ltszani. Ez a problma kikszblhet, ha a Delphiben belltod, hogy futsidben ilyen esetben adjon grdtsvokat a Formodhoz (Form.AutoScroll). Mindazonltal a Delphi egy sokkal szebb megoldst is nyjt az adott problmra. Ha a Delphi automatikus arnyostst (Form.Scaled) hasznlod, akkor a Delphi futsidben lekrdezi a rendszer kpernyfelbontst s eltrolja azt az alkalmazs Kperny objektumnak (Application.Screen) PixelPer Inch tulajdonsgban. Ezutn ezt az rtket hasznlva tmretezi a Formot (s annak tartalmt) az ppen aktulis kperny-felbontshoz viszonytva. Ahhoz, hogy ez a mdszer tnylegesen s eredmnyesen mkdjn, az albbi dolgokat kell szem eltt tartani: 1. 2. 3. 4. A Form 'Scaled' tulajdonsgt lltsd True-ra, az 'AutoScroll' tulajdonsgt pedig False-ra. Kizrlag TrueType fontokat hasznlj. A Windows kis fontjait hasznld fejleszts kzben. Egy Form

Az alkalmazs ikon-llapotban tartsaD1 D2 D3 D4 Forrs: Borland FAQ Utols mdosts: 1999. mjus 19.

(alkalmazs) ikon-llapotban tartsa a kvetkezkppen oldhat meg: 1. lltsd a Form WindowState tulajdonsgt wsMinimized rtkre. 2. A Form osztly deklarcijnak private rszben helyezd el a kvetkez sort:procedure WMQueryOpen(VAR Msg : TWMQueryOpen); message WM_QUERYOPEN;

3. A kifejt rszben pedig hozd ltre az albbi eljrst:procedure TForm1.WMQueryOpen(VAR Msg : TWMQueryOpen); begin Msg.Result := 0; end;

Az alkalmazs FFormjnak elrejtse Klnbz okokbl szksg lehet arra, hogy az alkalmazs FFormja rejtve maradjon. Ennek elrsre tbb t is knlkozik.D2 D3 D4 Forrs: Utols mdosts: 1999. mjus 27.

1. Mind tervezsi-, mind futsidben bellthatod, hogy a Form ikonllapotra vltson. Ehhez a WindowState tulajdonsgt wsMinimized-ra kell lltani. gy azonban a program ikonja a tlcn marad. 2. Ahhoz, hogy program teljesen rejtve maradjon, mint pldul a SystemTray-ben elhelyezked alkalmazsok (ilyen pl. a hangerszablyz), az alkalmazs ShowMainForm tulajdonsgt hamisra kell lltanod.Application.ShowMainForm:= false;

Ha azt szeretnd, hogy a FForm mr a program indtsakor is rejtve maradjon, akkor ezt a Project fjlban, vagy a FForm OnCreate esemnyben is megteheted. Kr alak, lyukas Form egyni fejlccel Az albbi pldaprogram ltrehoz egy kr alak, lyukas Formot, amelynek hajltott, a kr szlre illeszked fejlce van.D2 D3 D4 Forrs: Neil Rubenking Utols mdosts: 1999. jlius 4. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, Menus, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } rTitleBar : THandle; Center : TPoint;

CapY : Integer; Circum : Double; SB1 : TSpeedButton; RL, RR : Double; procedure TitleBar(Act : Boolean); procedure WMNCHITTEST(var Msg: TWMNCHitTest); message WM_NCHITTEST; procedure WMNCACTIVATE(var Msg: TWMNCACTIVATE); message WM_NCACTIVATE; procedure WMSetText(var Msg: TWMSetText); message WM_SETTEXT; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} CONST TitlColors : ARRAY[Boolean] OF TColor = (clInactiveCaption, clActiveCaption); TxtColors : ARRAY[Boolean] OF TColor = (clInactiveCaptionText, clCaptionText); procedure TForm1.FormCreate(Sender: TObject); VAR rTemp, rTemp2 : THandle; Vertices : ARRAY[0..2] OF TPoint; X, Y : INteger; begin Caption := 'OOOH! Doughnuts!'; BorderStyle := bsNone; {fontos!!!} IF Width > Height THEN Width := Height ELSE Height := Width; Center := Point(Width DIV 2, Height DIV 2); CapY := GetSystemMetrics(SM_CYCAPTION)+8; rTemp := CreateEllipticRgn(0, 0, Width, Height); rTemp2 := CreateEllipticRgn((Width DIV 4), (Height DIV 4), 3*(Width DIV 4), 3*(Height DIV 4)); CombineRgn(rTemp, rTemp, rTemp2, RGN_DIFF); SetWindowRgn(Handle, rTemp, True); DeleteObject(rTemp2); rTitleBar := CreateEllipticRgn(4, 4, Width-4, Height-4); rTemp := CreateEllipticRgn(CapY, CapY, Width-CapY, Height-CapY); CombineRgn(rTitleBar, rTitleBar, rTemp, RGN_DIFF); Vertices[0] := Point(0,0); Vertices[1] := Point(Width, 0); Vertices[2] := Point(Width DIV 2, Height DIV 2); rTemp := CreatePolygonRgn(Vertices, 3, ALTERNATE); CombineRgn(rTitleBar, rTitleBar, rTemp, RGN_AND); DeleteObject(rTemp); RL := ArcTan(Width / Height); RR := -RL + (22 / Center.X); X := Center.X-Round((Center.X-1-(CapY DIV 2))*Sin(RR)); Y := Center.Y-Round((Center.Y-1-(CapY DIV 2))*Cos(RR)); SB1 := TSpeedButton.Create(Self); WITH SB1 DO

end;

BEGIN Parent Left Top Width Height OnClick Caption Font.Style END;

:= := := := := := := :=

Self; X; Y; 14; 14; Button1Click; 'X'; [fsBold];

procedure TForm1.Button1Click(Sender: TObject); begin Close; End; procedure TForm1.WMNCHITTEST(var Msg: TWMNCHitTest); begin Inherited; WITH Msg DO WITH ScreenToClient(Point(XPos,YPos)) DO IF PtInRegion(rTitleBar, X, Y) AND (NOT PtInRect(SB1.BoundsRect, Point(X,Y))) THEN Result := htCaption; end; procedure TForm1.WMNCActivate(var Msg: TWMncActivate); begin Inherited; TitleBar(Msg.Active); end; procedure TForm1.WMSetText(var Msg: TWMSetText); begin Inherited; TitleBar(Active); end; procedure TForm1.TitleBar(Act: Boolean); VAR TF : TLogFont; R : Double; N, X, Y : Integer; begin IF Center.X = 0 THEN Exit; WITH Canvas DO begin Brush.Style := bsSolid; Brush.Color := TitlColors[Act]; PaintRgn(Handle, rTitleBar); R := RL; Brush.Color := TitlColors[Act]; Font.Name := 'Arial'; Font.Size := 12; Font.Color := TxtColors[Act]; Font.Style := [fsBold]; GetObject(Font.Handle, SizeOf(TLogFont), @TF); FOR N := 1 TO Length(Caption) DO BEGIN X := Center.X-Round((Center.X-6)*Sin(R));

end;

Y := Center.Y-Round((Center.Y-6)*Cos(R)); TF.lfEscapement := Round(R * 1800 / pi); Font.Handle := CreateFontIndirect(TF); TextOut(X, Y, Caption[N]); R := R - (((TextWidth(Caption[N]))+2) / Center.X); IF R < RR THEN Break; END; Font.Name := 'MS Sans Serif'; Font.Size := 8; Font.Color := clWindowText; Font.Style := []; end;

procedure TForm1.FormPaint(Sender: TObject); begin WITH Canvas DO BEGIN Pen.Color := clBlack; Brush.Style := bsClear; Pen.Width := 1; Pen.Color := clWhite; Arc(1, 1, Width-1, Height-1, Width, 0, 0, Height); Arc((Width DIV 4)-1, (Height DIV 4)-1, 3*(Width DIV 4)+1, 3*(Height DIV 4)+1, 0, Height, Width, 0); Pen.Color := clBlack; Arc(1, 1, Width-1, Height-1, 0, Height, Width, 0); Arc((Width DIV 4)-1, (Height DIV 4)-1, 3*(Width DIV 4)+1, 3*(Height DIV 4)+1, Width, 0, 0, Height); TitleBar(Active); END; end; end.

Szntmenetes Form ltrehozsa Az albbi pldaprogram bemutatja, hogy hogyan lehet egy szntmenetes Formot ltrehozni. A pldban a Form szne feketbl ttnik a sznvlaszt prbeszdablakban (ColorDialogBox) megadott sznbe.D2 D3 D4 Forrs: Lewis Howell Utols mdosts: 1999. jlius 24.

A sznek manipullsra a GetRValue(), GetBValue(), GetGValue() s az RGB() Win32 API fggvnyeket, a Form megfestsre pedig a TCanvas.MoveTo() s a TCanvas.LineTo() eljrsokat hasznljuk.unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; ColorDialog1: TColorDialog; procedure Button1Click(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormCreate(Sender: TObject);

private { Private declarations } EndColor:TColor; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin {A vgszn bekrse} ColorDialog1.Execute; EndColor := ColorDialog1.Color; {A Form Paint esemnynek meghvsa} Repaint; end; procedure TForm1.FormPaint(Sender: TObject); var x,GradientDistance,GradientWidth : Integer; tmpColor : TColor; NewRed,NewGreen,NewBlue : Byte; EndRed,EndGreen,EndBlue : Byte; begin {Ha nincs belltva vgszn, kilp.} if EndColor = clBlack then Exit; {A tmpcolor inicializlsa} tmpColor := EndColor; {A szntmenet hossza} GradientDistance := Height; {A szntmenet szlessge} GradientWidth := Width; {A vrs, zld s kk kezdrtkei} EndRed := GetRValue(EndColor); EndBlue := GetBValue(EndColor); EndGreen := GetGValue(EndColor); {tmenet a kezd s a vgs sznrtk kzt} for x := 1 to GradientDistance do begin {A szn vrs, zld s kk sszetevinek belltsa az aktulis tvolsgnak a teljes tvolsghoz viszonytott arnyban} NewRed := (x*EndRed) div GradientDistance; NewBlue := (x*EndBlue) div GradientDistance; NewGreen := (x*EndGreen) div GradientDistance; {Az j szn megadsa a megvltozott vrs, zld kk szneknek megfelelen} tmpColor := RGB(NewRed,NewGreen,NewBlue); {Az j festszn belltsa} Canvas.Pen.Color := tmpColor; {A vonalnak az j sznnel val megrajzolsa} Canvas.MoveTo(0,x); Canvas.LineTo(GradientWidth,x); end; end;

procedure TForm1.FormCreate(Sender: TObject); begin {A vgszn kezdeti rtknek megadsa} EndColor := clBlack; end; end. Grafika

JPEG fjl begyazsa a programba (EXE-be) Ez az egyszer t lpsbl ll mdszer bemutatja, hogy hogyan kell bepteni JPEG fjlokat a program EXE-be, majd azokat onnan hasznlni.D3 D4 Forrs: Marko Peric Utols mdosts: 1999. mrcius 13.

1. Kszts egy n. 'Resource script' fjlt (MyPic.RC) egy egyszer szvegszerkesztvel, mint pldul a Jegyzettmb, s add hozz az albbi sort:1

Az els bejegyzs (1) az erforrs sorszma. A msodik bejegyzs (RCDATA) meghatrozza, hogy egy felhasznl ltal megadott erforrsrl van sz. A harmadik, utols bejegyzs a hasznlni kvnt JPEG fjl neve. 2. Hasznld a Borland Erforrs-szerkesztjt (BRCC32.EXE) a ltrehozott RC fjl lefordtshoz. Ez az RC fjlbl egy binris Erforrs (Resource) fjlt (*.RES) hoz ltre. Futtatshoz a DOS parancssorba rd az albbiakat:BRCC32 MyPic.RC

RCDATA

"MyPic.jpg"

Ez ltrehozza a 'MyPic.RES' nev RES fjlt. 3. A kvetkez fordtsi direktvval utastjuk a fordtt, hogy az elkszlt erforrs-fjlt ptse bele a programba:{$R *.DFM} {$R MyPic.RES}

4. Add a kvetkez eljrst a programhoz:procedure LoadJPEGfromEXE; var MyJPG : TJPEGImage; // JPEG objektum ResStream : TResourceStream; // Resource Stream objektum begin try MyJPG := TJPEGImage.Create; ResStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA); MyJPG.LoadFromStream(ResStream); // Ennyi az egsz... Canvas.Draw(12,12,MyJPG); // Megrajzolja a kpet finally MyJPG.Free; ResStream.Free; end; end; // procedure

Figyeld meg a TResourceStream komponens CreateFormID eljrs msodik paramtert. Ez hvja meg az erforrs-fjlbl a kvnt fjlt,

mghozz egyszeren az erforrs sorszmt megadva. Termszetesen a fent lert mdon tbb JPEG fjlt is belegyazhatunk a program EXE-be. Ehhez a klnbz JPEG fjloknak kln sorban ms-ms sorszmot kell adni a Resource (.RC) Fjlban. 5. Hvd meg valahonnan az eljrst s mr ksz is az egsz. Az alkalmazs ikonjnak megvltoztatsa futsidben Az alkalmazs ikonjnak futsidej megvltoztatshoz egyszeren t kell lltani az alkalmazs Icon tulajdonsgt a megfelel ikonra. Pldul gy:D1 D2 D3 D4 Forrs: www.preview.org Utols mdosts: 1999. jnius 7. if (Working) then Application.Icon.LoadFromFile(StartupDirectory + 'Busy.ico') else Application.Icon.LoadFromFile(StartupDirectory + 'Lazy.ico');

Ikon talaktsa BitmappD2 D3 D4 Forrs: Ulli Conrad (Kiegsztve) Utols mdosts: 1999. jnius 7.

Az

albbi mdszer bemutatja, hogy hogyan lehet egy FileListBox-ban kivlasztott fjlhoz trstott alkalmazsbl kinyerni a fjl ikonjt. Ezt az ikont talaktjuk Bitmapp, megjelentjk egy TImeage-ben, majd elmentjk BMP formtumban.uses ShellAPI; . . .

procedure TForm1.Button1Click(Sender: TObject); var Icon : TIcon; Bitmap : TBitmap; w : word; hi : HIcon; S : PChar; begin Icon:=TIcon.Create; // Az ikon ltrehozsa Bitmap := TBitmap.Create; // A bitmap lrehozsa w:=0; // A trstott EXE els ikonja S:= PChar(FileListBox1.FileName); hi:=ExtractAssociatedIcon(hInstance,S,w); // Az ikon kinyerse Icon.Handle:=hi; // a fjlbl Bitmap.Width:=Icon.Width; // A bitmap mrete legyen Bitmap.Height:=Icon.Height; // az ikon mrete Bitmap.Canvas.Draw(0, 0, Icon ); // Az ikon tartalmnak // bitmapra rajzolsa Image1.Picture.Bitmap:=Bitmap; // A bitmap megjelentse Bitmap.SaveToFile('c:\proba.bmp'); // A bitmap elmentse Icon.Free; Bitmap.Free; end;

Szntmenetes Form ltrehozsa Az albbi pldaprogram bemutatja, hogy hogyan lehet egy szntmenetes Formot ltrehozni. A pldban a Form szne feketbl ttnik a sznvlasztD2 D3 D4 Forrs: Lewis Howell Utols mdosts: 1999. jlius 24.

prbeszdablakban (ColorDialogBox) megadott sznbe. A sznek manipullsra a GetRValue(), GetBValue(), GetGValue() s az RGB() Win32 API fggvnyeket, a Form megfestsre pedig a TCanvas.MoveTo() s a TCanvas.LineTo() eljrsokat hasznljuk.unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; ColorDialog1: TColorDialog; procedure Button1Click(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } EndColor:TColor; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin {A vgszn bekrse} ColorDialog1.Execute; EndColor := ColorDialog1.Color; {A Form Paint esemnynek meghvsa} Repaint; end; procedure TForm1.FormPaint(Sender: TObject); var x,GradientDistance,GradientWidth : Integer; tmpColor : TColor; NewRed,NewGreen,NewBlue : Byte; EndRed,EndGreen,EndBlue : Byte; begin {Ha nincs belltva vgszn, kilp.} if EndColor = clBlack then Exit; {A tmpcolor inicializlsa} tmpColor := EndColor; {A szntmenet hossza} GradientDistance := Height; {A szntmenet szlessge} GradientWidth := Width; {A vrs, zld s kk kezdrtkei} EndRed := GetRValue(EndColor);

EndBlue := GetBValue(EndColor); EndGreen := GetGValue(EndColor); {tmenet a kezd s a vgs sznrtk kzt} for x := 1 to GradientDistance do begin {A szn vrs, zld s kk sszetevinek belltsa az aktulis tvolsgnak a teljes tvolsghoz viszonytott arnyban} NewRed := (x*EndRed) div GradientDistance; NewBlue := (x*EndBlue) div GradientDistance; NewGreen := (x*EndGreen) div GradientDistance; {Az j szn megadsa a megvltozott vrs, zld kk szneknek megfelelen} tmpColor := RGB(NewRed,NewGreen,NewBlue); {Az j festszn belltsa} Canvas.Pen.Color := tmpColor; {A vonalnak az j sznnel val megrajzolsa} Canvas.MoveTo(0,x); Canvas.LineTo(GradientWidth,x); end; end; procedure TForm1.FormCreate(Sender: TObject); begin {A vgszn kezdeti rtknek megadsa} EndColor := clBlack; end; end.

Rajzols kzvetlenl a Windows AsztalraD1 D2 D3 D4 Forrs: Borland FAQ (Kiegsztve) Utols mdosts: 1999. augusztus 28.

A lenti plda a GetDC(0) Windows API fggvny ltal visszaadott DC-t hasznlva a WinAPI rajzol funkcikkal a Windows asztalra rajzol egy ferde fekete vonalat.procedure TForm1.Button1Click(Sender: TObject); var dc : hdc; begin dc := GetDc(0); MoveToEx(Dc, 0, 0, nil); LineTo(Dc, 300, 300); ReleaseDc(0, Dc); end;

DC (Device Context) - Kapcsolat egy windows alkalmazs, egy eszkzmeghajt (driver) s egy kimeneti eszkz (pl. kperny) kztt. function GetDC(Wnd: HWnd): HDC; - visszaadja egy megadott ablak kliensterletre vonatkoz DC kezeljt (Handle). function ReleaseDC(Wnd: HWnd; DC: HDC): Integer; - felszabadtja az adott DC-t, hogy azt ms alkalmazsok is hasznlhassk. function MoveToEx(DC: HDC; nX, nY: Integer; Point: PPoint): Bool; - az aktulis pozcit az x s y paramterekben megadott pontra helyezi. function LineTo(DC: HDC; X, Y: Integer): Bool; - az aktulis pozcitl a megadott pontig egy vonalat hz s az aktulis pozcit a paramterben megadott pontra lltja.

A sznek HTML rtknek megllaptsa Egy szn HTML rtknek kpzse hasonl a szn hexadecimlis rtkhez. Az egyik eltrs az, hogy az rtk nem dollr ($), hanem ketts kereszt (#) jellel kezddik. A msik klnbsg pedig az, hogy a vrs s a kk byte helyek felcserldnek. (#FF0000 = vrs, #00FF00 = zld, #0000FF = kk)D1 D2 D3 D4 Forrs: Lewis Howell Utols mdosts: 1999. augusztus 29.

A lenti egyszer plda egy zenetablakban megjelenti a sznvlaszt prbeszdablakban (TColorDialog) kivlasztott szn HTML rtkt. A GetRValue, GetGValue s a GetBValue WinAPI fggvnyek segtsgvel megkapjuk a sznt alkot alapsznek (vrs, zld, kk) intenzitst, majd a Format() formz fggvnnyel sszerakjuk a HTML sznrtkek kpzsnek szablyai szerint gy megkapott rtkeket.{ . . . } type TForm1 = class(TForm) Button1: TButton; ColorDialog1: TColorDialog; procedure Button1Click(Sender: TObject); private { Private declarations } function HTMLColorValue(AColor:TColor):String; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var tmpColor : TColor; begin {A ColorDialog meghvsa} if ColorDialog1.Execute then begin {A kivlasztott szn} tmpColor := ColorDialog1.Color; {A szn talaktsa s megjelentse} ShowMessage(HTMLColorValue(tmpColor)); end; end; function TForm1.HTMLColorValue(AColor:TColor):String; var Red, Blue, Green : Integer; begin {A vrs szn intenzitsa} Red := GetRValue(AColor); {A kk szn intenzitsa} Blue := GetBValue(AColor); {A zld szn intenzitsa} Green := GetGValue(AColor);

{A szn talaktsa HTML formtumra} Result := Format('#%2.2x%2.2x%2.2x', [Red,Green,Blue]); end; { . . . }

Hardware

A processzor aktulis sebessgeD2, D3, D4 Forrs: SK Computer Solutions Utols mdosts: 1998. november 24.

A

processzor aktulis sebessgt az albbi fggvny meghvsval lehet megjelenteni:function TForm1.GetCpuSpeed: Extended; var t: DWORD; mhi, mlo, nhi, nlo: DWORD; t0, t1, chi, clo, shr32: Comp; begin shr32 := 65536; shr32 := shr32 * 65536; t := GetTickCount; while t = GetTickCount do begin end; asm DB 0FH DB 031H mov mhi,edx mov mlo,eax end; while GetTickCount < (t + 1000) asm DB 0FH DB 031H mov nhi,edx mov nlo,eax end; chi := mhi; if mhi < 0 then chi clo := mlo; if mlo < 0 then clo t0 := chi * shr32 + clo; chi := nhi; if nhi < 0 then chi clo := nlo; if nlo < 0 then clo t1 := chi * shr32 + clo; Result := (t1 - t0) / 1E6; end; do begin end;

:= chi + shr32; := clo + shr32; := chi + shr32; := clo + shr32;

//A fggvny meghvsa procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption := FloatToStr(GetCpuSpeed) + ' mhz'; end;

A CD meghajt ajtajnak kinyitsa s bezrsa A CD meghajt ajtajt az albbi utastsokkal lehet Delphi programbl kinyitni illetve bezrni: (pl. egy gomb lenyomsval)D3, D4 Forrs: Christian Piene Gundersen Utols mdosts: 1998. november 24. uses MMSystem; ...

// kinyitja a CD ajtajt mciSendString('Set cdaudio door open wait', nil, 0, handle); // bezrja a CD ajtajt mciSendString('Set cdaudio door closed wait', nil, 0, handle);

Ennyi az egsz... A merevlemez sorozatszmnak megllaptsaD2, D3, D4 Forrs: Christian Piene Gundersen Utols mdosts: 1998. november 14.

A merevlemez (a pldban 'C:\') sorozatszmt az albbi eljrssal lehet megjelenteni:procedure TForm1.Button1Click(Sender: TObject); var SerialNum : pdword; a, b : dword; Buffer : array [0..255] of char; begin if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then Label1.Caption := IntToStr(SerialNum^); end;

Audio CD van a meghajtban vagy nem? A GetDriveType() Windows API fggvnnyel elszr megllapthat, hogy a vizsglt meghajt CD-ROM meghajt-e, majd a GetVolumeInformation() Windows API fggvnnyel pedig megvizsglhatjuk, hogy a 'VolumeName' rtke 'Audio CD'-e vagy sem.D2, D3, D4 Forrs: Borland FAQ Utols mdosts: 1998. november 26. uses MPlayer; ... function IsAudioCD(Drive : char) : bool; var DrivePath : string; MaximumComponentLength : DWORD; FileSystemFlags : DWORD; VolumeName : string; begin Result := false; DrivePath := Drive + ':\'; if GetDriveType(PChar(DrivePath)) DRIVE_CDROM then exit; SetLength(VolumeName, 64); GetVolumeInformation(PChar(DrivePath), PChar(VolumeName), Length(VolumeName), nil, MaximumComponentLength, FileSystemFlags,

nil, 0); if lStrCmp(PChar(VolumeName),'Audio CD') = 0 then result := true; end; function PlayAudioCD(Drive : char) : bool; var mp : TMediaPlayer; begin result := false; Application.ProcessMessages; if not IsAudioCD(Drive) then exit; mp := TMediaPlayer.Create(nil); mp.Visible := false; mp.Parent := Application.MainForm; mp.Shareable := true; mp.DeviceType := dtCDAudio; mp.FileName := Drive + ':'; mp.Shareable := true; mp.Open; Application.ProcessMessages; mp.Play; Application.ProcessMessages; mp.Close; Application.ProcessMessages; mp.free; result := true; end; procedure TForm1.Button1Click(Sender: TObject); begin if not PlayAudioCD('D') then ShowMessage('Not an Audio CD'); end;

Van lemez az 'a:\' meghajtban?D2, D3, D4 Forrs: David S. Becker Utols mdosts: 1998. november 26.

Prbld

ki ezt a fggvnyt:var

function DiskExists(Drive: Char): Boolean; ErrorMode: Word;

begin Drive := UpCase(Drive); { Megvizsglja, hogy a meghajt betjele rvnyes-e } if not (Drive in ['A'..'Z']) then raise EConvertError.Create('Not a valid drive letter'); { Kikapcsolja a kritikus hibkat } ErrorMode := SetErrorMode(SEM_FailCriticalErrors); try Application.ProcessMessages; Result := (DiskSize(Ord(Drive) - Ord('A') + 1) -1); finally { Visszalltja az eredeti hibamdot } SetErrorMode(ErrorMode);

end;

Application.ProcessMessages; end;

Az A:\ meghajtban lv lemez formzsa A Shell32.dll-ben van egy nem dokumentlt API fggvny, nevezetesen a SHFormatDrive, amely megnyitja a 3,5'' lemez (A:\) formzsa prbeszdablakot. Az albbi plda ennek mkdst mutatja be:D2 D3 D4 Forrs: David Ku Utols mdosts: 1999. jnius 8. implementation {$R *.DFM} const SHFMT_ID_DEFAULT = $FFFF; // Formzsi tulajdonsgok SHFMT_OPT_QUICKFORMAT = $0000; SHFMT_OPT_FULL = $0001; SHFMT_OPT_SYSONLY = $0002; // Hiba kdok SHFMT_ERROR = $FFFFFFFF; SHFMT_CANCEL = $FFFFFFFE; SHFMT_NOFORMAT = $FFFFFFFD;

function SHFormatDrive(Handle:HWND; Drive, ID, Options:Word): LongInt; stdcall; external 'shell32.dll' name 'SHFormatDrive' procedure TForm1.btnFormatDiskClick(Sender : TObject); var retCode: LongInt; begin retCode:= SHFormatDrive(Handle, 0, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT); if retCode < 0 then ShowMessage('A lemez nem lett formzva.'); end;

Egy meghajt teljes mretnek s a szabad lemezterletnek a megllaptsa D1 D2 D3 D4 Forrs: Lewis Howell Utols mdosts: 1999. augusztus 8. 1. Egy meghajt teljes mretnek s az azon rendelkezsre ll szabad lemezterletnek a megllaptsra a Delphi albbi kt fggvnyt hasznlhatjuk: DiskSize() - visszaadja bjtokban a paramterben tadott meghajt teljes mrett. DiskFree() - viszaadja bjtokban a paramterben tadott meghajtn rendelkezsre ll szabad lemezterletet. (rvnytelen meghajt megadsa esetn mindkt fggvny -1-gyel tr vissza.) Mindkt fggvny egyetlen paramtere a meghajt jellszma. 0 = aktulis meghajt, ahonnan a program EXE-t indtottk; 1 = A:\ meghajt; 2 = B:\ meghajt; 3 = C:\ meghajt; 4 = D:\ meghajt stb.

2. Egy plda a fenti kt fggvny hasznlatra:procedure TForm1.Button1Click(Sender: TObject); var TotalFree, TotalSize : Integer; begin TotalFree := DiskFree(3); if TotalFree -1 then begin TotalSize := DiskSize(3); if TotalSize -1 then begin TotalFree := TotalFree div 1024; TotalSize := TotalSize div 1024; ShowMessage('Disk Free: '+format('%d',[TotalFree]) + ' kb' + #13 + 'Disk Size: '+format('%d',[TotalSize]) + ' kb'); end; end; end;

A gpben tallhat meghajtk fajtja 1. Egy meghajt fajtjt a GetDriveType() WinAPI fggvny segtsgvel tudjuk megllaptani.D3 D4 Forrs: Lewis Howell Utols mdosts: 1999. augusztus 31.

GetDriveType() : WinAPI fggvny, amely visszaadja a meghajt tpust. Az egyetlen paramter, amit t kell adni neki, a meghajt betjele A:\ formtumban. A fggvny visszatrsi rtkei a kvetkezk:

0 : nem llapthat meg 1 : a gykrknyvtr nem ltezik DRIVE_REMOVABLE : a lemez eltvolthat a meghajtbl (floppy) DRIVE_FIXED : a lemez nem tvolthat el a meghajtbl (merevlemez) DRIVE_REMOTE : hlzati meghajt DRIVE_CDROM : CD-ROM meghajt DRIVE_RAMDISK : RAM disk

2. Az albbi plda egy gomb lenyomsra egy ListBox-ban megjelenti a gpen tallhat meghajtk betjelt s fajtjt. A GetDriveType() fggvny ltal visszaadott (meghajt-tpus) rtket egy tbbg szelekcival (case) rtkeljk ki, majd hozzadjuk a ListBox elemeihez.{ . . . } type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;

{

.

.

.

}

procedure TForm1.Button1Click(Sender: TObject); var x : char; DrvType : Integer; DrvLetter, DrvString : String; begin ListBox1.Clear; {25 lehetsges meghajt ... a-z} for x := 'A' to 'Z' do begin DrvLetter := x +':\'; {A meghajt-tpus megllaptsa} DrvType := GetDriveType(pChar(DrvLetter)); {A visszatr rtk elemzse} case DrvType of 0,1 : DrvString := ''; DRIVE_REMOVABLE : DrvString := 'Removable'; DRIVE_FIXED : DrvString := 'Fixed'; DRIVE_REMOTE : DrvString := 'Network'; DRIVE_CDROM : DrvString := 'CD-ROM'; DRIVE_RAMDISK : DrvString := 'RAM disk'; end; {Ha nem res a meghajt tpust jell string, akkor a betjelt s tpust hozzadjuk a ListBox elemeihez} if DrvString '' then Listbox1.Items.Add(DrvLetter + ' = ' + DrvString); end; end; { . . . }

Internet s HTML

Csatlakozva van a gp az Internetre?D3 D4 Forrs: Deborah Pate Utols mdosts: 1999. mjus 28.

1. Hogy megtudjuk, hogy csatlakozva van-e a gp az Internetre hasznlhatjuk a TCP komponenst, amelynek segtsgvel megkapjuk a helyi IP cmet. Ha ennek rtke "0.0.0.0", akkor nincs kapcsolat, ha ms, akkor van.procedure TForm1.Button1Click(Sender: TObject); begin if TCP1.LocalIp = '0.0.0.0' then ShowMessage('Nincs kapcsolat!'); end;

2. Egy msik megolds:uses wininet.pas function IsConnectedToInternet: bool; begin dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY; if InternetGetConnectedState(@dwConnectionTypes, 0) then

Result := True else Result := False; end;

Az URL megllaptsa egy *.url fjlbl Az albbi fggvny visszaadja a FileName paramterben megadott *.url fjlban trolt URL-t:D3 D4 Forrs: Lindsoe Utols mdosts: 1999. mjus 28. function ResolveInternetShortcut(Filename: string): PChar; var FName: array[0..MAX_PATH] of WideChar; Malloc: IMalloc; IUrl: IUniformResourceLocator; PersistFile: IPersistfile; begin IUrl := CreateComObject(CLSID_InternetShortcut) as IUniformResourceLocator; Persistfile := IUrl as IPersistFile; StringToWideChar(FileName, FName, MAX_PATH); PersistFile.Load(Fname, STGM_READ); IUrl.geturl(@Result); ShGetMalloc(Malloc); Malloc.Free(@Result); end;

Internetes hivatkozs (Link) ltrehozsaD2 D3 D4 Forrs: Utols mdosts: 1999. jnius 11.

1. uses ShellAPI

2. Helyezz egy TLabel komponenst a Formra. 3. lltsd a Font.Style tulajdonsgt fsUnderline-ra, a Cursor tulajdonsgt pedig crHandPoint-ra. 4. Majd add a kvetkez WinAPI fggvnyt az OnClick esemnyhez:ShellExecute(Handle,'open', 'http://www.yahoo.com' ,'','', SW_SHOWMAXIMIZED);

Amennyiben pedig egy e-mail cmre akarsz hivatkozni, akkor azt add meg a fggvny harmadik paramterben. Pldul gy:ShellExecute(Handle,'open', 'mailto:[email protected]' ,'','', SW_SHOWNORMAL); Billentyzet s egr

hasznlata helyett 1. Ha a Form sszes objektumra (mr amelyiknl lehet) alkalmazni akarom a TAB-ot helyettest ENTER eljrst, akkor a legegyszerbb megolds: A Form KeyPreview tulajdonsgt True-ra kell lltani, majd a Form OnKeyPress esemnybe az albbi sorokat kell rni:D2, D3, D4 Forrs: Utols mdosts: 1998. november 14. procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if (Key = #13) then //vagy 'if Key = Chr(VK_RETURN) then' begin Key := #0; //Eat the ENTER Key Perform(WM_NEXTDLGCTL, 0, 0); //A kvetkez kontrol {Perform(WM_NEXTDLGCTL, 1, 0)} //Az elz control end;

end;

2. Ha csak bizonyos objektumokra akarom alkalmazni (a gombokra nem lehet), akkor a kvnt objektumokat kijellve az OnKeyPress esemnyket be kell lltani az albbi MyKeyPress eljrsra (a Form OnKeyPress-t nem).procedure TForm1.MyKeyPress(Sender: TObject; var Key:Char); begin if Key = Chr(VK_RETURN) then //vagy 'if (Key = #13) then' begin Perform(WM_NEXTDLGCTL,0,0); key:= #0; end; end;

A Ctrl+Alt+Del, az Alt+Tab s a Ctrl+Esc billentykombincik letiltsaD2, D3, D4 Forrs: Meik Weber , Richard Leigh Utols mdosts: 1998. november 15.

1. Az sszes rendszer billentykombinci letiltsa s vissszakapcsolsa (Meik Weber):procedure TurnSysKeysOff; //Kikapcsolja var OldVal : LongInt; begin SystemParametersInfo (97, Word (True), @OldVal, 0) end; procedure TurnSysKeysBackOn; //Bekapcsolja var OldVal : LongInt; begin SystemParametersInfo (97, Word (False), @OldVal, 0) end;

2. Egy msik megolds (Richard Leigh):procedure TurnSysKeysOff; //Kikapcsolja var Dummy:integer; begin Dummy:=0; SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @Dummy, 0); end; procedure TurnSysKeysOn; //Bekapcsolja var Dummy:integer; begin Dummy:=0; SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, @Dummy, 0); end;

nimlt kurzorok hasznlataD3, D4 Forrs: John F. Goyvaerts ([email protected]) Utols mdosts: 1998. november 15. Egy egyszer megolds: const crMyCursor = 1; ... procedure TForm1.FormCreate(Sender: TObject); begin // Betlti a kurzorfjlt. Screen.Cursors[crMyCursor] := LoadCursorFromFile('c:\windows\cursors\globe.ani'); // Hozzrendeli a kurzort a formhoz. Cursor := crMyCursor; end;

A kurzorvezrl billentyk (nyilak) hasznlata A kurzorvezrl billentyk eredeti funkcijnak megvltoztatshoz (fellrshoz) a Form vagy az adott okjektum(ok) OnKeyDown esemnyt kell az albbiak szerint meghatrozni. (A lenti pldban a LE s FEL nyilakkal lehet a kvetkez illetve az elz controlra vltani; mint a TAB-bal.) Fontos, hogy a Form KeyPreview tulajdonsgt True-ra lltsuk.D2, D3, D4 Forrs: Utols mdosts: 1998. november 14. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=VK_DOWN) then //bal nyl VK_LEFT PostMessage(Handle, WM_NEXTDLGCTL, 0, 0); {kvetkez kontrol} if (KEY=VK_UP) then //jobb nyl VK_RIGHT PostMessage(Handle, WM_NEXTDLGCTL, 1, 0); {elz kontrol} end;

A fenti eljrst nem csak a kurzorvezrl nyilakkal lehet hasznlni, hanem sok ms billenty (pl. End, Home, etc.) gynevezett 'Virtual-Key' kdja behelyttesthet a VK_DOWN illetve VK_UP helybe. A klnbz billentyk Windows ltal hasznlt VK kdjai megtekintshez kattins ide. A Caps Lock, Num Lock, Scroll Lock hasznlataD1, D2, D3, D4 Forrs: Mark Vaughan ([email protected]) Utols mdosts: 1998. november 15. Ez az eljrs a gomb megnyomsra bekapcsolja a

Caps Lock (nagybets) mdot, majd ismtelt megnyomsra kikapcsolja azt.procedure TForm1.Button1Click(Sender: TObject); Var KeyState : TKeyboardState;

begin GetKeyboardState(KeyState); if (KeyState[VK_CAPITAL] = 0) then KeyState[VK_CAPITAL] := 1 // Bekapcsolja a Caps Lockot else KeyState[VK_CAPITAL] := 0; //Kikapcsolja a Caps Lockot SetKeyboardState(KeyState); end;

A Num Lock s a Scoll Lock ki- s bekapcsolsa ugyanezzel az eljrssal oldhat meg csak a VK_CAPITAL helyre VK_NUMLOCK kerl illetve a VK_SCROLL kerl. OnMouseEnter s OnMouseLeaveD1, D2, D3, D4 Forrs:SK Computer Solutions Utols mdosts: 1998. november 20.

A TComponent minden leszrmazottja egy CM_MOUSEENTER illetve CM_MOUSELEAVE zenetet kld amikor az egr belp vagy kilp a komponens keretein. Ahhoz, hogy ezeket az zeneteket 'elkapjuk' egy zenetkezel eljrst kell ltrehoznunk. Az albbi plda egy Formon lv hrom cmke (Label) s egy jellngyzet (CheckBox) szvegnek sznt vltoztatja meg a kurzor belpsekor s kilpsekor.// Fll kell rni a WndProc eljrst procedure WndProc(var Message : TMessage); override; procedure ChangeColor(Sender : TObject; Msg : Integer); ... procedure TForm1.WndProc(var Message : TMessage); begin // Melyik komponens fltt van a kurzor? // Annak a szne vltozzon! if Message.LParam = Longint(Label1) then ChangeColor(Label1, Message.Msg); if Message.LParam = Longint(Label2) then ChangeColor(Label2, Message.Msg); if Message.LParam = Longint(Label3) then ChangeColor(Label3, Message.Msg); if Message.LParam = Longint(CheckBox1) then ChangeColor(CheckBox1, Message.Msg); inherited WndProc(Message); end; procedure TForm1.ChangeColor(Sender : TObject; Msg : Integer); Begin // Ha Cmke (Label) fltt van a kurzor If Sender Is TLabel Then Begin

if (Msg = CM_MOUSELEAVE) then (Sender As TLabel).Font.Color := clWindowText; if (Msg = CM_MOUSEENTER) then (Sender As TLabel).Font.Color := clBlue; End; // Ha CheckBox fltt van a kurzor If Sender Is TCheckBox Then Begin if (Msg = CM_MOUSELEAVE) then (Sender As TCheckBox).Font.Color := clWindowText; if (Msg = CM_MOUSEENTER) then (Sender As TCheckBox).Font.Color := clRed; End; End;

A szn megvltoztatsa helyett brilyen ms esemnyt meg lehet hatrozni...Komponensek

Gombokbl ll tmb (array of TButton) Ez az egyszer kis program futsidben ltrehoz ngy gombot s egy cmkt. A gombok lenyomsakor a cmkn megjelenik a lenyomott gomb sorszma.D1 D2 D3 D4 Forrs: D.F. Hartley Utols mdosts: 1999. jnius 8.

A program futtatshoz nem kell mst tenned, csak kszts egy j projectet, msold az albbi szveget a Unit1-be, s rendeld hozz FormCreate esemnykezelt a Form1 OnCreate esemnyhez (dupla kattints a Formon vagy az Object Inspectorban).unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure ButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} const

b = 4;

{A ltrehozand gombok szma}

var ButtonArray : Array[0..b-1] of TButton; {A Gombokbl ll tmb...} MessageBox: TLabel; {...s a cmke definilsa} procedure TForm1.FormCreate(Sender: TObject); var loop : integer; begin ClientWidth:=(b*60)+10; {A Form mretnek} ClientHeight:=65; {meghatrozsa} MessageBox:=TLabel.Create(Self); {A cmke ltrehozsa...} MessageBox.Parent:=Self; MessageBox.Align:=alTop; {...s tulajdonsgainak} MessageBox.Alignment:=taCenter; {meghatrozsa} MessageBox.Caption:='Nyomj le egy gombot!'; for loop:= 0 to b-1 do {A Gombok ltrehozsa...} begin ButtonArray[loop]:=TButton.Create(Self); with ButtonArray[loop] do begin Parent :=self; {...s tulajdonsgaiknak} Caption :=IntToStr(loop); {meghatrozsa} Width :=50; Height :=25; Top :=30; Left :=(loop*60)+10; Tag :=loop; {Ez mondja meg, hogy melyik gombot} OnClick :=ButtonClick; {nyomtuk le...} end; end; end; procedure TForm1.ButtonClick(Sender: TObject); var t : Integer; begin t:=(Sender as TButton).Tag; {A Gomb azonostjnak megllaptsa} MessageBox.Caption:='Az '+IntToStr(t)+'. szm gombot nyomtad le.'; end; end. Menkezels

A Shift, Ctrl s Alt billentyk llapotnak 'elkapsa' menparancsok esetnD2, D3, D4 Forrs: Rodney E Geraghty Utols mdosts: 1998. december 26.

Ha a menesemnyekkel a Shift, Ctrl vagy Alt billentyk llapottl fgg utastst akarsz vgrehajtani, akkor a kvetkez pldban szemlltetett mdon lehet megtudni, hogy az adott billentyk le vannak-e nyomva vagy sem mikor a menure kattintunk.procedure TForm1.Menu1Click(Sender: TObject); begin

{Check if Shift key is down} if HiWord(GetKeyState(VK_SHIFT)) 0 then Label1.Caption := 'Shift' else {Check if Ctrl key is down} if HiWord(GetKeyState(VK_CONTROL)) 0 then Label1.Caption := 'Control' else {Check if Alt key is down} if HiWord(GetKeyState(VK_MENU)) 0 then Label1.Caption := 'Alt' else Label1.Caption := 'None'; end;

Menpontok dinamikus ltrehozsa/trlse futsidbenD1, D2, D3, D4 Forrs: Jeff Lawton, Jani Jrvinen Utols mdosts: 1998. december 26.

1. Els megolds (Jeff Lawton): A menpontok futsidben trtn hozzadst/eltvoltst a Create, Add, Insert, Remove metdusokkal lehet vgrehajtani. j menfpont hozzadsaprocedure tform1.addmainitem(s:string); var newitem : Tmenuitem; begin newitem:=tmenuitem.create(Mainmenu1); newitem.caption:=s; {ha egy OnClick esemnyt akarsz hozzrendelni newitem.onclick:=Dynamenuclick; } {adja a fmenhz} mainmenu1.items.insert(mainmenu1.items.count,newitem); removemenu1.enabled:=true; addmenuitem1.enabled:=true; end;

j menalpont hozzadsaprocedure tform1.addsubitem(s:string; to : integer); var newitem, toitem : Tmenuitem; begin {to = fmenpont, amihez hozzadja az almenpontot}

toitem:=mainmenu1.items[to]; newitem:=tmenuitem.create(toitem); newitem.caption:=s; {ha egy OnClick esemnyt akarsz hozzrendelni newitem.onclick:=Dynamenuclick; } toitem.onclick:=nil; toitem.insert(toitem.count,newitem); removemenuitem1.enabled:=true; end;

2. Egy msik megolds (Jani Jrvinen): Hasznlhatod a 'Menus' unitban elre definilt menfunkcikat is.function NewMenu(Owner: TComponent; const AName: string; Items: array of TMenuItem): TMainMenu; function NewPopupMenu(Owner: TComponent; const AName: string; Alignment: TPopupAlignment; AutoPopup: Boolean; Items: array of TMenuitem): TPopupMenu; function NewSubMenu(const ACaption: string; hCtx: Word; const AName: string; Items: array of TMenuItem): TMenuItem; function NewItem(const ACaption: string; AShortCut: TShortCut; AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: Word; const AName: string): TMenuItem; function NewLine: TMenuItem; {j elvlaszt vonal}

Ezek hasznlatra egy plda (UNDU - Robert Vivrette)PopupMenu1 := TPopupMenu.Create(Self); with PopUpMenu1.Items do begin Add(NewItem('First Menu',0,False,True,MenuItem1Click,0,'MenuItem1')); Add(NewItem('Second Menu',0,False,True,MenuItem2Click,0,'MenuItem2')); Add(NewItem('Third Menu',0,False,True,MenuItem3Click,0,'MenuItem3')); Add(NewLine); // j elvlaszt vonal

Add(NewItem('Fourth Menu',0,False,True,MenuItem4Click,0,'MenuItem4')); end;

Kp hozzadsa a menpontokhozD1, D2, D3, D4 Forrs: Kurt Claeys (kiegsztve) Utols mdosts: 1998. december 26.

A menpontokhoz egy kis kp (BMP) hozzadsa nem egy tl nehz feladat. A hozzrendelshez a SetMenuItemBitmaps API hivatkozst hasznlhatjuk az albbiak szerint:procedure TForm1.FormCreate(Sender: TObject); var

Bmp1 : TPicture; Bmp2 : TPicture; begin Bmp1 := TPicture.Create; Bmp1.LoadFromFile('C:\Dokumentumok\ikon1.bmp'); Bmp2 := TPicture.Create; Bmp2.LoadFromFile('C:\Dokumentumok\ikon2.bmp'); SetMenuItemBitmaps( FileMenu.Handle, 0, MF_BYPOSITION, Bmp1.Bitmap.Handle, Bmp2.Bitmap.Handle); end;

1. Elszr ltrehozza az egyik (Checked) kpet, majd hozzrendeli a kpet tartalmaz fjlt. 2. Ltrehozza a msik (Unchecked) kpet is. Ehhez is hozzrendeli a megadott fjlt. 3.Meghvja a SetMenuItemBitmaps API hvst a megadott paramterekkel: a) A FileMenu a 'fggleges' fmen neve. b) A 0,1,2... a menpont menben lv helyzett jelli (A pldban a Fjl men els eleme) c) Az els Bitmap.Handle a menpont nem jellt (Unchecked) kpt tlti be, a msodik pedig a menpont jellt (Checked) kpt. Megjegyzs: A kpeknek csak a bal fels sarka fog ltszani, ha a kp tl nagy lenne a rendelkezsre ll helyhez kpest. Sajnos a jells nem vltozik meg automatikusan, de ezen knnyen lehet segteni, ha az adott menpont OnClick esemnybe az albbi sorkat rjuk:procedure TForm1.MyComp1Click(Sender: TObject); begin if MyComp1.Checked then MyComp1.Checked:=False else MyComp1.Checked :=True end;

A Start! gomb elrejtse a tlcrl A Start! gomb tlcrl val eltntetst ezzel az eljrssal tudod megoldani:D2 D3 D4 Forrs: Carsten Paasch Utols mdosts: 1998. november 15. procedure hideStartbutton(visi:boolean); Var Tray, Child : hWnd; C : Array[0..127] of Char; S : String; Begin Tray := FindWindow('Shell_TrayWnd', NIL); Child := GetWindow(Tray, GW_CHILD); While Child 0 do Begin

If GetClassName(Child, C, SizeOf(C)) > 0 Then Begin S := StrPAS(C); If UpperCase(S) = 'BUTTON' then begin startbutton_handle:=child; // IsWindowVisible(Child) If Visi then ShowWindow(Child, 1) else ShowWindow(Child, 0); end; End; Child := GetWindow(Child, GW_HWNDNEXT); End; End; Ez+Az

Az alkalmazs ikonjnak megvltoztatsa futsidben Az alkalmazs ikonjnak futsidej megvltoztatshoz egyszeren t kell lltani az alkalmazs Icon tulajdonsgt a megfelel ikonra. Pldul gy:D1 D2 D3 D4 Forrs: www.preview.org Utols mdosts: 1999. mjus 14. if (Working) then Application.Icon.LoadFromFile(StartupDirectory + 'Busy.ico') else Application.Icon.LoadFromFile(StartupDirectory + 'Lazy.ico');

Delphi programok paramteres indtsa Ha egy fjl trstva van valamely programhoz, akkor a fjlra trtn dupla kattints hatsra elindul a program, s (tbbnyire) automatikusan betlti az adott fjlt. Hasonl helyzet ll el, ha a program EXE-jre dobunk r egy vagy tbb fjlt. Ezt gy oldja meg a Windows, hogy paramterknt tadja a trstott programnak a kivlasztott fjl(ok) elrsi tjt.D1 D2 D3 D4 Forrs: Sebestyn dm Utols mdosts: 1999. jlius 24.

A parancssori paramterek kezelse a Delphi System unitjnak kt albbi fggvnyvel oldhat meg: function ParamCount: Word; - visszaadja a programnak a parancssorban tadott paramterek szmt. function ParamStr(Index): string; - visszaadja az adott helyen lv paramter rtkt. (A ParamStr(0) pedig a program teljes elrsi utjval tr vissza.) A lenti eljrs, ha a programot paramterekkel indtottuk, az tadott paramtereket egy ListBox soraiba tlti, ha pedig nem adtunk t paramtert, akkor a 'Nincs paramter.' szveg zenettel tr vissza.procedure TForm1.FormCreate(Sender: TObject); var I: Word; begin if ParamCount > 0 then for I := 1 to ParamCount do begin ListBox1.Items.Add(ParamStr(I)); end else ShowMessage('Nincs paramter.') end;

Tbb soros Hint (gyorstipp) Ha azt szeretnnk, hogy egy komponensnek ne csupn egy, hanem tbb sorbl ll Hint-je (gyorstippje?) legyen, akkor azt az albbi mdszerrel knnyen megoldhatjuk.D1 D2 D3 D4 Forrs: Sebestyn dm Utols mdosts: 1999. augusztus 22.

1. lltsuk az adott komponens ShowHint tulajdonsgt True-ra, de a Hint tulajdonsgnak ne adjunk meg semmit. 2. Ezutn a Form OnCreate esemnyben az albbi mdon adjunk rtket a komponens Hint tulajdonsgnak. A megolds lnyege a soremel karakter (#13 vagy Chr(13)).procedure TForm1.FormCreate(Sender: TObject); var Datum : string; begin Datum := FormatDateTime('dddddd', Now); Form1.Hint := 'A mai dtum:' + #13 + Datum end;

A globlis vltozk egyszerbb kezelse Sokszor igen nehz fejben tartani az sszes, klnbz helyeken deklarlt globlis (akr tbb unit ltal is hasznlt) vltoz nevt s tpust. A Delphi 3 s a ksbbi verzik hasznlata esetn a Delphi n. Code Insight szolgltatsnak segtsgvel egy nagyon hasznos segtsget kapunk, ha ezeket a vltozkat egy rekord adattpusban troljuk el. Ha ugyanis a ksbbiekben hivatkozni akarunk valamely a rekordban eltrolt vltozra, csak meg kell adni a rekord nevt s a Delphi kdkiegszt funkcija (Code Completition Wizard) automatikusan megjelenti egy legrdl listban a vltozkat s azok tpust. Innen mr csak ki kell vlasztani az ppen szksgeset.D3 D4 Forrs: Robert Vivrette Utols mdosts: 1999. augusztus 26.

1. Mindehhez csak deklarlni kell egy rekord adattpust egy ltalnosan elrhet Unitban. Pl. gy:Type TMyGlobals = Record IsSelected UserName DBName RecordNum Status end; : : : : : Boolean; String; String; Integer; Byte;

2. Majd ltre kell hozni egy ilyen tpusu