Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigene Window-klasse ändern (https://www.delphipraxis.net/107851-eigene-window-klasse-aendern.html)

k4ni 3. Feb 2008 14:33


Eigene Window-klasse ändern
 
hey DP,

Ich hab schon überall gesucht, aber nix gefunden.
Wie kann ich meine eigene Fenster-klasse ändern die bei delphi immer TApplication ist ?
Also ich will es nicht ändern während das programm läuft, sondern allgemein.
Aber ich kann nirgens finden wie das gehen könnte, Application.ClassName kann man nicht ändern.

Danke im vorraus :)

mkinzler 3. Feb 2008 14:34

Re: Eigene Window-klasse ändern
 
-Implemtiere deine eigen Forms.pas
-Class-Helper

alzaimar 3. Feb 2008 16:34

Re: Eigene Window-klasse ändern
 
Was willst du eigentlich ändern? Nebenbei: TApplication ist keine Windows-Klasse, sondern TForm.

toms 3. Feb 2008 16:39

Re: Eigene Window-klasse ändern
 
Zitat:

Zitat von k4ni
Application.ClassName

"TApplication" ist in der Unit Forms.pas "hardcoded", kann also nicht geändert werden.
Alternative "nonVCL", d.h das Fenster selber erstellen ohne VCL.

Mark90 3. Feb 2008 20:03

Re: Eigene Window-klasse ändern
 
non-vcl!

Delphi-Quellcode:
CreateWindowEx(Null, 'fenster-klasse'(hier ändern), 'fenstertitel', WS_VISIBLE(eigenschaften), ....);

SirThornberry 3. Feb 2008 20:06

Re: Eigene Window-klasse ändern
 
Zitat:

Zitat von alzaimar
... Nebenbei: TApplication ist keine Windows-Klasse, sondern TForm.

Und wie kommt TApplication dann zu seinem Window-Handle? :gruebel:

alzaimar 3. Feb 2008 21:54

Re: Eigene Window-klasse ändern
 
Zitat:

Zitat von SirThornberry
Und wie kommt TApplication dann zu seinem Window-Handle? :gruebel:

Das weist Du nicht? :stupid:
Ich nahm an, das k4ni unter Fenster-Klasse eher eine Klasse versteht, die wie ein Fenster aussieht. Und ich nebenbei auch.

Luckie 4. Feb 2008 08:13

Re: Eigene Window-klasse ändern
 
Nimm die VCL nicht als Fensterklassennamen den Name der TForm-Klasse?

sirius 4. Feb 2008 12:39

Re: Eigene Window-klasse ändern
 
Mir erschließt sich noch nicht der Sinn (und auch nicht der Unsinn), aber
mal wieder ein lustig Stück Code:
Delphi-Quellcode:
interface

implementation

uses windows;

const NewName='Hallo'#0; //Neuer ClassName des MainWindow



type PJmp=^TJmp;
     TJmp=packed record
       JmpFar:word;
       adr:longint;
     end;
type PJmpnew=^TJmpNew;
     TJmpNew=packed record
       Jmp:byte;
       adr:longInt;
       nop:byte;
     end;

var oldAdr:LongInt;


procedure change(ret:pointer;instance:cardinal;Name:PChar;WndClass:PWndclass);cdecl;
var mbi:memory_basic_information;
    temp,old:cardinal;
    oldJmp:PJmp;
    Jmp:PJmpNew;
begin
  if Name='TApplication' then
  begin
    //TApplication nach [NewName] ändern
    assert(not virtualquery(name,mbi,sizeof(mbi))<>sizeof(mbi),'VirtualQuery');
    assert(virtualprotect(mbi.BaseAddress,mbi.RegionSize,Page_Execute_ReadWrite,old),'VirtualProtect');
    move(NewName,name^,length(newname));
    assert(virtualprotect(mbi.BaseAddress,mbi.RegionSize,old,temp),'VirtualProtect');


    //Sprung von GetClassInfo(A) zurücksetzen
    oldJmp:=@getclassinfo;
    Jmp:=pointer(oldJmp);
    assert((jmp^.Jmp=$E9)and(jmp^.nop=$90),'GetclassInfo');
    assert(not virtualquery(jmp,mbi,sizeof(mbi))<>sizeof(mbi),'VirtualQuery');
    assert(virtualprotect(mbi.BaseAddress,mbi.RegionSize,Page_Execute_ReadWrite,old),'VirtualProtect');
    OldJmp^.JMPFar:=$25FF;
    oldJmp^.adr:=oldAdr;
    assert(virtualprotect(mbi.BaseAddress,mbi.RegionSize,old,temp),'VirtualProtect');
  end;
end;

procedure NewClassInfo;
//change aufrufen und dann zur ursprünglichen getClassInfo(A) springen
asm
  call change
  mov eax,oldAdr
  jmp [eax]
end;


procedure changeWindowclass;
//Sprung von GetClassInfo(A) auf NewClassInfo ändern
var jmp:PJmp;
    jmpNew:PJmpNew;
    temp,old:cardinal;
    mbi:Memory_Basic_Information;
begin

  jmp:=@getclassinfo;
  assert(jmp^.JMPFar=$25FF,'GetClassInfo');

  oldAdr:=jmp^.adr;
  JmpNew:=pointer(jmp);

  assert(not virtualquery(jmp,mbi,sizeof(mbi))<>sizeof(mbi),'VirtualQuery');
  assert(virtualprotect(mbi.BaseAddress,mbi.RegionSize,Page_Execute_ReadWrite,old),'VirtualProtect');

  JmpNew^.Jmp:=$E9;
  JmpNew^.Adr:=integer(@newClassInfo)-integer(jmp)-5;
  JmpNew^.nop:=$90;

  assert(virtualprotect(mbi.BaseAddress,mbi.RegionSize,old,temp),'VirtualProtect');
end;


initialization
changeWindowClass;

end.
Wenn du diese Unit als erste (oder nach MemoryManager) in deine Projektdatei übernimmst, dann solltest du aus deinem MainWindow.ClassName etwas anderes machen können (Hier: Hallo). Der Name (NewName) darf nicht mehr als 63 Zeichen enthalten.

Sauber ist das, wie du siehst, bei weitem nicht und ob es dadurch irgendwo noch zu Problemen kommen kann weis ich nicht (ich sehe erstmal keine unter D7).

Das gleiche erreichst du (wie weiter oben geschrieben) auch, wenn du direkt in der Unit Forms die Konstante "WindowClass" entsprechend änderst. Mehr macht der Code oben auch nicht. Nur dass du eben die Unit Forms nicht ändern musst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz