|
Registriert seit: 27. Mai 2007 122 Beiträge Delphi 7 Enterprise |
#1
Hi,
Ich habe jetzt mal nützliche Codes gesammelt, die jeder mal braucht ![]() PS: Sie stammen aus den weiten des Internets, credits to wer auch immer!
Delphi-Quellcode:
//Titelleiste anzeigen / verstecken
Params.Style := (Params.Style or WS_POPUP) and not WS_DLGFRAME;
Delphi-Quellcode:
//Form aus Taskleiste ausblenden
ShowWindow(Application.Handle, SW_HIDE); ================================================== ==========
Delphi-Quellcode:
protected
procedure CreateParams(var Params: TCreateParams); override; { ... } var MitRand : boolean = True; procedure TForm1.FormCreate(Sender: TObject); begin if MitRand then // Wenn du nen Fensterrahmen haben willst, dann musst du "Minimieren" deaktivieren BorderIcons := BorderIcons - [biMinimize] else // Oder gleich "Keinen Fensterrahmen" setzen BorderStyle := bsNone; // Nun noch nach ganz oben FormStyle := fsStayOnTop; end; procedure TForm1.CreateParams(var Params: TCreateParams); begin inherited; // Flags setzen Params.Style := Params.Style or WS_OVERLAPPED; // Parent auf "Desktop" setzen Params.WndParent := GetDesktopWindow; end; ================================================== ========== Startbutton Anzeigen/Verstecken (Deaktiviert auch das Startmenü) Beispiel: ShowStartButton(False);
Delphi-Quellcode:
procedure ShowStartButton(bvisible: Boolean);
var h: hwnd; TaskWindow: hwnd; begin if bvisible then begin h := FindWindowEx(GetDesktopWindow, 0, 'Button', nil); TaskWindow := FindWindow('Shell_TrayWnd', nil); ShowWindow(h, 1); Windows.SetParent(h, TaskWindow); end else begin h := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil); ShowWindow(h, 0); Windows.SetParent(h, 0); end; end; ================================================== ========== Formular lässt sich nicht schließen (Alt+F4 wird auch deaktiviert) Programm kann nur über Application.Terminate; geschlossen werden
Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := False; end; ================================================== ========== Desktop/Taskleiste (de)aktivieren
Delphi-Quellcode:
Desktop:
//ausschalten ShowWindow(FindWindow(nil,'Program Manager'),sw_hide); //einschalten ShowWindow(FindWindow(nil,'Program Manager'),sw_show);
Delphi-Quellcode:
Taskleiste:
//deaktivieren EnableWindow(FindWindow('Shell_TrayWnd', nil),false); //aktivieren EnableWindow(FindWindow('Shell_TrayWnd', nil),true); ================================================== ==========
Delphi-Quellcode:
//Main Form nicht anzeigen!
Application.ShowMainForm:= false; ================================================== ========== Wie manipuliere ich die Form eines Formulars ( z. B. Formular als Kreis )? Dafür gibt es die sogenannten "Regions":
Delphi-Quellcode:
Dieses Beispiel hat Michael Schüle in dclpd gepostet. Die Anregung dazu hat er wohl dem Buch "Borland Delphi 3 für Profis" von Walter Doberenz und Thomans Kowalski aus dem Hanser Verlag entnommen.
procedure TForm1.FormCreate(Sender:TObject);
var HR: HRgn; n:array[0..3] of TPoint; begin n[0]:=Point(Width div 2,1); n[1]:=Point(1, Height div 2); n[2]:=Point(Width div 2,Height); n[3]:=Point(Width, Height div 2); HR:= CreateEllipticRgn (0, 0, Width, Height); {oder eine Raute: HR:= CreatePolygonRgn(n, 4, Alternate);} SetWindowRgn(Handle, HR, True); end; Applications running in different resolutions 1. I belive I have found the answer to a lot of peoples questions (mine included) about Applications that run in different resolutions. The problem is if you develop an Application in one resolution, say 1024x768 using Large fonts, then try and run it at say 800x600 using Small fonts. Labels get chopped and components are different sizes than when designed. Other weird looking things happen too. Well, I found that by changing the PITCH property on the FONT to VARIABLE instead of DEFAULT that it looks the same in every resolution. This should be done to every component and to the Form itself. (Does anyone know where "Default" is set?) 2. After much experimenting, it appears that delphi figures some font size and scaling factors at design time, and doesn't re-calculate them at run time. This seems to cause some of the "special effects" at different resolutions (i.e. edit boxes with only half of the text visible, and labels partly chopped off). To get around this, make delphi re-calculate these values, by simply assigning the main form's font at run time (in the oncreate event), as well as any other controls in which you didn't use the ParentFont option. I think calling the Font's OnChange event will correct the problem as well, but I haven't tried it yet. I sincerely wish we could get a difinitive answer from borland, or someone very knowledgeable on this topic. On a side note, if I tried to re-assign PixelsPerInch, or the scaled properties at run time, I got a general protection fault (even the example code in the help file gave a GPF). Code-Schnipsel dafür: Auf jeden Fall habe ich mal ein Stueck Code dafuer gekriegt, das zu meiner grossen Ueberraschung bis jetzt jedes Formular mitsamt allem Geraffel drauf prima skaliert hat. Es sind nur ein paar Zeilen im FormCreate des Haupt- formulars und dazu zwei Konstanten (global definiert):
Delphi-Quellcode:
{statt XXX und YYY die Aufloesung zur Entwicklungszeit eintragen.
const ScreenWidthDev = XXX;
ScreenHeightDev = YYY; Angeblich soll der Code am besten von der hoechsten Aufloesung runterskalieren. Ich musste aber immer von 640/480 (die hohen Aufloesungen kommen bei mir nicht so gut) hochskalieren und es ging auch.}
Delphi-Quellcode:
Worueber ich mich immer wieder wundern kann: Mit dieser Methode werden ALLE Fenster des Projekts skaliert, obwohl doch eigentlich ausdruecklich nur Form1 skaliert wird. Komisch.
procedure TForm1.FormCreate(Sender: TObject);
var x,y: Integer; // f. Bildschirmauflösung begin Scaled:= true; x:= Screen.Width; y:= Screen.Height; if (x<>ScreenWidthDev) or (y<>ScreenHeightDev) then begin Form1.Height:= (Form1.ClientHeight*y div ScreenHeightDev) + Form1.Height - Form1.ClientHeight; Form1.Width:= (Form1.ClientWidth*y div ScreenWidthDev) + Form1.Width - Form1.ClientWidth; ScaleBy(x,ScreenWidthDev); end; // of if ================================================== ========== Ein Fenster einer Anwendung immer zuoberst anzeigen, auch bei minimiertem Hauptfenster Manchmal möchte man, daß geöffnete (Unter-)Fenster einer Anwendung auf dem Desktop bleiben, wenn das Hauptfenster minimiert wird, oder daß ein Fenster immer im Vordergrund bleibt, auch wenn es nicht den Fokus hat. Ich will mal kurz zeigen, wie man das zur Laufzeit einstellen kann:
Delphi-Quellcode:
FormStyle dabei auf fsNormal setzen. Das ist alles! (Ralph Stoesser)
//OnTop..
SetWindowPos(Handle, HWND_TOPMOST, Left,Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //..und zurück: SetWindowPos(Handle, HWND_NOTOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //OnDesktop.. SetWindowLong(Handle, GWL_HWNDPARENT, 0); //..und zurück: SetWindowLong(Handle, GWL_HWNDPARENT, Application.Handle); ================================================== ========== Wie kann ich ein Fenster transparent darstellen? Zwei einfache Tricks, um ein Fenster "unsichtbar", also transparent zu zeichnen: 1. So kann man die Transparenz zur Laufzeit umschalten:
Delphi-Quellcode:
Procedure MakeWindowTransparent (Form: TForm);
Var CurrentStyle : LongInt; Begin Form.Visible := False; CurrentStyle := GetWindowLong(Form.Handle, GWL_EXSTYLE); SetWindowLong(Form.Handle, GWL_EXSTYLE, CurrentStyle Or WS_EX_TRANSPARENT); Form.Visible := True; End; {Paul Röttgen} Procedure MakeWindowOpaque (Form: TForm); Var CurrentStyle : LongInt; Begin Form.Visible := False; CurrentStyle := GetWindowLong (Form.Handle, GWL_EXSTYLE); SetWindowLong(Form.Handle, GWL_EXSTYLE, CurrentStyle And Not WS_EX_TRANSPARENT); Form.Visible := True; End; {Paul Röttgen} 2. So wird ein Fenster transparent erstellt:
Delphi-Quellcode:
Allerdings sorgt dieses Beispiel nur dafür, daß beim Zeichnen des Fensters der Hintergrund nicht übermalt wird. Soblad das fenster verschoben wird oder der Hintergrund sich ändert, ist der Anschein der Transparenz dahin.
procedure TForm1.FormCreate(Sender: TObject);
begin Form1.Brush.Style := bsClear; Form1.BorderStyle := bsNone; end; Wie erzeuge ich ein Formular ohne Titelleiste? 1. Möglichkeit: TForm.BorderStyle auf bsNone zu setzen. Leider ergibt das ein Formular, das dann gar keine Begrenzung mehr hat. Abhilfe schafft ein TBevel, dessen Align man auf alClient setzt. 2. Möglichkeit: Die Methode CreateParams überschreiben, in der der Parameter-Record für die Fenstererzeugung initialisiert wird:
Delphi-Quellcode:
Diese Kombination hat den Effekt, daß die Titelleiste entfernt wird, der Begrenzungsstil aber den eingestellten Wert behält.
{ Private Deklaration }
procedure CreateParams(var Params : TCreateParams); override; ... { Implementation: } procedure TForm1.CreateParams(var Params : TCreateParams); begin Inherited Createparams(Params); with Params do Style := (Style or WS_POPUP) and not WS_DLGFRAME; end; 3. Möglichkeit:
Delphi-Quellcode:
In der OnCreate-Methode des Formulars die API-Funktion "SetWindowLong" aufrufen:
procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_CAPTION); ClientHeight:=Height; end; ================================================== ========== Um ein Formular ohne Titelleiste noch mit der Maus verschieben zu können, muß man diesem einen Klick auf die (nicht vorhandene) Titelzeile vorgaukeln, wenn der Anwender auf eine beliebige Stelle im Formular klickt. Dazu fügt man folgenden Code in die "OnMouseDown"-Methode des Formulars ein:
Delphi-Quellcode:
if ssLeft in Shift then begin
ReleaseCapture; Self.Perform(WM_NCLBUTTONDOWN, HTCAPTION, varEmpty); end; ================================================== ========== Mit der Enter-Taste den Fokus auf das nächste Control setzen Um nach Betätigen der Enter-Taste zum nächsten Control auf einem Formular zu wechseln, muß man zuerst die "KeyPreview"-Eigenschaft des Formulars auf "true" setzen. Anschließend kann man in der OnKeyPress-Methode des Formulars auf die Enter-Taste reagieren:
Delphi-Quellcode:
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char);
begin if Key = #13 then begin {#13 = Enter} Key := #0; PostMessage(Handle, WM_NextDlgCtl, 0, 0); end; end; Bemerkung: Das funktioniert nicht mit einem DBGrid, weil das nächste Feld dort kein separates Objekt darstellt. Welche Ereignisse werden beim Erstellen und Anzeigen eines Formulars ausgelöst? Folgende Ereignisse werden in dieser Reihenfolge abgefeuert: * OnCreate * OnShow * OnPaint * OnActivate * OnResize * und nocheinmal OnPaint. ================================================== ========== Taskbareinträge auch für untergeordnete Formulare anzeigen Mit der API-Funktion "SetWindowLong" kann man den Fensterstil so einstellen, daß auch für untergeordnete Dialogfenster eines Programms Einträge in der Windows-Taskbar erscheinen:
Delphi-Quellcode:
procedure TForm2.FormShow(Sender: TObject);
begin SetWindowLong(Handle, GWL_ExStyle, WS_Ex_AppWindow); end; ================================================== ========== Im Abschnitt "Applikationen" der Delphi Fundgrube erfährt man, wie man ein Programm ganz ohne Taskbareinträge starten kann. Ein Fenster zum obersten Fenster (Topmost) auf dem Desktop machen Mit welchem API-Aufruf kann ich ein Fenster zum Vordergrundfenster machen (also auch gegenüber Fenstern von anderen Prozessen), so als würde FormStyle auf fsStayOnTop stehen? Mit der API-Funktion "SetWindowPos" bestimmt man unter anderem auch die Position eines Fensters in der Z-Ordnung:
Delphi-Quellcode:
{Fenster nach vorne setzen:}
SetWindowPos(Handle, HWND_TOPMOST, Left,Top, Width,Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); {..und wieder zurück:} SetWindowPos(Handle, HWND_NOTOPMOST, Left, Top, Width,Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); ================================================== ========== STRG + ALT + ENTF deaktivieren (WindowsXP)
Delphi-Quellcode:
procedure ctrlaltdel;
var a,b,c:hwnd; begin a:=FindWindow('#32770', NiL); b:=findwindowex(a,0,'#32770',nil); c:=findwindowex(b,0,'SysListView32',nil); enablewindow(c,false); end; //put a timer(interval = 5) and write this to ontimer event ctrlaltdel; ================================================== ========== Windows Version auslesen: The following information applies to: * Windows API * Delphi (All Versions) Steps, Assumptions, Procedures: * Uses Windows.pas
Delphi-Quellcode:
procedure GetOSVersion;
var VersionInfo: TOSVersionInfo; Platform: string; MajorVersion,MinorVersion,Build: DWORD; begin VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo); GetVersionEx(VersionInfo); with VersionInfo do begin case dwPlatformId of VER_PLATFORM_WIN32s: Platform := 'Windows 3x'; VER_PLATFORM_WIN32_WINDOWS: Platform := 'Windows 95'; VER_PLATFORM_WIN32_NT: Platform := 'Windows NT'; end; MajorVersion := dwMajorVersion; MinorVersion := dwMinorVersion; Build := dwBuildNumber; end; end;
Takeo
|
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |