Programování ve Windowsrůzné vychytávkyMinimalizace celé aplikace z podřízeného okna, Rychlé kopírování souboru, Vícejazyčná aplikace, Práce se soubory, které mají asociaci, Práce se soubory, které mají asociaci, Variantní počet parametrů vstupujících do procedury Minimalizace celé aplikace z podřízeného oknaČasto se vyskytne potřeba minimalizovat celou aplikaci. Máte však zobrazeno jedno nebo více podřízených oken a při minimalizaci takovéhoto okna se zmenší pouze toto okno a zbytek aplikace zůstane tzv. "viset". Pro některé uživatele to může znamenat vážný problém. Jiný způsob je zrušit všechna podřízená okna a poté hlavní okno aplikace minimalizovat. Máte-li rozdělanou práci, představuje to opět problém. Velmi elegantní řešení je použít do každého podřízeného okna níže uvedený kód. Do privátní deklarace vložte tuto proceduru: procedure WM_MyMessage(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND; Do implementační části vložte tuto odpovídající proceduru: procedure TForm1.WM_MyMessage(var Msg: TWMSYSCOMMAND); begin if Msg.CmdType = SC_MINIMIZE then Application.Minimize else Inherited; end; To je vše. Rychlé kopírování souboruProcedure Kopiruj( Const ZdrojovySoubor, CilovySoubor: String ); Var Zdroj, Cil: TFileStream; Begin Zdroj := TFileStream.Create( ZdrojovySoubor, fmOpenRead ); try Cil := TFileStream.Create( CilovySoubor, fmOpenWrite or fmCreate ); try Cil.CopyFrom(Zdroj, Zdroj.Size ) ; finally Cil.Free; end; finally Zdroj.Free; end; End; Vícejazyčná aplikacechcete-li programovat aplikaci a nechce se vám dělat varianta pro různé jazyky zvlášť, lze to vyřešit pomocí Resources, například takto: unit French1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IniFiles; type TForm1 = class(TForm) Button1: TButton; procedure FormActivate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; StringIndex : Integer; implementation {$R *.DFM} {$R MULTLANG.RES} { něco podobného by měl obsahovat resource soubor, všimněte si, že zlom je na pozici 8: 1, "Attention" 2, "No Condition definition selected!" 3, "Always" 4, "Cannot delete the 'always' condition." 5, "Confirmation" 6, "Delete the condition?" 7, "Yes" 8, "No" 9, "Attention" 10, "Pas de condition Selectionnée" 11, "Toulours" 12, "Ne peux effacer la condition 'Toujours'" 13, "Confirmation" 14, "Effacer cette condition?" 15, "&Oui" 16, "&Non" } procedure TForm1.FormActivate(Sender: TObject); var {inifile : TIniFile; Optional} ProgramLanguage : String; begin { natrdo nastavené , že chceme francouštinu } ProgramLanguage := 'fra'; { Lepší je nastavení číst ze souboru (např:Win.INI) nebo z registru Windows:} {inifile := TInifile.Create('WIN.INI'); ProgramLanguage := inifile.ReadString('intl', 'sLanguage', 'enu'); inifile.Free;} { Ve Win.ini můžete najít následující údaj v položce INTL dan = Danish nld = Dutch enu = English (American) eng = English (International) fin = Finnish fra = French frc = French Canadian deu = German isl = Icelandic ita = Italian nor = Norwegian ptg = Portuguese esp = Spanish esn = Spanish (Modern) sve = Swedish } if ProgramLanguage = 'enu' then begin StringIndex := 0; end else if ProgramLanguage = 'fra' then begin StringIndex := 8; end; end; procedure TForm1.Button1Click(Sender: TObject); var i,j,k : integer; DialogForm : tform; begin Application.NormalizeTopMosts; {no Condition Selected!} DialogForm := CreateMessageDialog(LoadStr(StringIndex+2), mtWarning,[mbOK]); {Attention} DialogForm.caption := LoadStr(StringIndex + 1); DialogForm.showmodal; Application.RestoreTopMosts; {Cannot Delete the 'always' condition} DialogForm := CreateMessageDialog(LoadStr(StringIndex+4), mtWarning,[mbOK]); {Always} DialogForm.caption := LoadStr(StringIndex + 3); DialogForm.showmodal; Application.RestoreTopMosts; {Delete the condition?} DialogForm := CreateMessageDialog(LoadStr(StringIndex+6), mtInformation, [mbYes, mbNo]); {confirmation} DialogForm.caption := LoadStr(StringIndex + 5); for j := 0 to DialogForm.controlCount-1 do begin if DialogForm.controls[j] is tButton then with tButton(DialogForm.controls[j]) do begin if caption = '&Yes' then caption := LoadStr(StringIndex+7); if caption = '&No' then caption := LoadStr(StringIndex+8); end; end; DialogForm.showmodal; end; end. Práce se soubory, které mají asociaciZde není co dodat... unit UcShell; { Author: Michael Ax www.axsystems.com Copyright (c) 1995..1997 Michael Ax. All Rights Reserved. This source code is part of TPack from HREF Tools Corp. Obtain purchasing and additional information by sending an email to software@href.com (any subject, any message)... or visit us on the web at www.href.com/software/ } interface uses Classes, SysUtils, Windows, ShellApi, Forms; {----------------------------------------------------------} function WinExecutableName(const AssociatedFile:string):String; procedure WinShellOpen(const AssociatedFile:string); procedure WinShellPrint(const AssociatedFile:string); procedure WinShellExecute(const Operation,AssociatedFile:string); {---------------------------------------------------------------} implementation Const cStrBufSize= 80; {---------------------------------------------------------------} function WinExecutableName(const AssociatedFile:string):String; //HINSTANCE FindExecutable( // LPCTSTR lpFile, // pointer to string for filename // LPCTSTR lpDirectory, // pointer to string for default directory // LPTSTR lpResult // pointer to buffer for string for executable file on return // ); begin SetLength(result,cStrBufSize); //ucshell FindExecutable(pchar(AssociatedFile),'',pchar(result)); SetLength(result,strlen(pchar(result))); end; // procedure WinShellExecute(const Operation,AssociatedFile:string); var a1:string; begin a1:=Operation; if a1='' then a1:='open'; ShellExecute( application.handle //hWnd: HWND ,pchar(a1) //Operation: PChar ,pchar(AssociatedFile) //FileName: PChar ,'' //Parameters: PChar ,'' //Directory: PChar ,SW_SHOWNORMAL //ShowCmd: Integer ); // GetLastErrorString(0); //ucdialog end; procedure WinShellPrint(const AssociatedFile:string); begin WinShellExecute('print',AssociatedFile); end; procedure WinShellOpen(const AssociatedFile:string); begin WinShellExecute('open',AssociatedFile); end; {--------------------------------------------------------} end. MAPI a MS ExchangeChcete-li pracovat s poštou, potřebujete znát tyto příkazy: Příhlášení se do pošty MapiLogon(application.handle,nil,nil,mapi_use_default,0,@mapihandle) poslání mejlu MapiSendMail(mapihandle, 0,MapiMessage,0, 0); Před tímto příkazem musí být vyplněny pole SUBJECT, RECIP a NOTTEXT ve struktuře MapiMessage nebo se zpráva neodešle. Variantní počet parametrů vstupujících do proceduryPůvodní autor: hallvard@falcon.no (Hallvard Vassbotn) program VarPar; { A simple program to demonstrate use of type-safe variable number of parameters in Delphi. Written Mars 1995 by Hallvard Vassbotn hallvard@falcon.no } uses WinCrt, SysUtils; { These are predefined in System: const vtInteger = 0; vtBoolean = 1; vtChar = 2; vtExtended = 3; vtString = 4; vtPointer = 5; vtPChar = 6; vtObject = 7; vtClass = 8; type TVarRec = record case Integer of vtInteger: (VInteger: Longint; VType: Byte); vtBoolean: (VBoolean: Boolean); vtChar: (VChar: Char); vtExtended: (VExtended: PExtended); vtString: (VString: PString); vtPointer: (VPointer: Pointer); vtPChar: (VPChar: PChar); vtObject: (VObject: TObject); vtClass: (VClass: TClass); end; } const TypeNames : array [vtInteger..vtClass] of PChar = ('Integer', 'Boolean', 'Char', 'Extended', 'String', 'Pointer', 'PChar', 'Object', 'Class'); { According to the on-line docs (search for TVarRec), array of const parameters are treated like array of TVarRec by the compiler. This example will work just as well if you change the declaration of TestMultiPar to: procedure TestMultiPar(const Args: array of TVarRec); This would make the implementation of the routine cleaner (no absolute variable declaration), but the interface would be less understandable to the user of the routine. The compiler looks at the parameters and builds the array directly on the stack. For each item in the array it also sets the VType field to one of the pre-defined constants vtXXXX. The actual value is always sent as four bytes of information. For the Boolean and Char types, only the first byte contains useful information. So, go ahead, now you can write all those neat routines with variable number of parameters - and still keep the type safety! } function PtrToHex(P: pointer): string; begin Result := IntToHex(Seg(P^), 4) + ':' + IntToHex(Ofs(P^), 4); end; procedure TestMultiPar(const Args: array of const); var ArgsTyped : array [0..$fff0 div sizeof(TVarRec)] of TVarRec absolute Args; i : integer; begin for i := Low(Args) to High(Args) do with ArgsTyped[i] do begin Write('Args[', i, '] : ', TypeNames[VType], ' = '); case VType of vtInteger: writeln(VInteger); vtBoolean: writeln(VBoolean); vtChar: writeln(VChar); vtExtended: writeln(VExtended^:0:4); vtString: writeln(VString^); vtPointer: writeln(PtrToHex(VPointer)); vtPChar: writeln(VPChar); vtObject: writeln(PtrToHex(Pointer(VObject))); vtClass: writeln(PtrToHex(Pointer(VClass))); end; end; end; var MyObj : TObject; {toto je jen zkušební} begin Writeln('Test of type-safe variable number of parameters in Delphi:'); MyObj := TObject.Create; TestMultiPar([123, 45.67, PChar('ASCIIZ'), 'Hello, world!', true, 'X', @ShortDayNames, TObject, MyObj]); MyObj.Free; { To verify that the type-safety is used in the supplied formatting routines,try this: } writeln(Format('%d', ['hi'])); { The supplied parameter is not of the type expected. The '%d' format string signals that the parameter should be an integer value, but instead we send a string. At run-time this will generate a exception, and if you have enabled IDE-trapping of exceptions, Delphi will show you the offending line. Using c-type sprintf funtions like this will result in undefined behaviour (read: system crash, GP or whatever) } end. |
WEBovský
počítadlo spočítalo, že si číslo
|