Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:49

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Freepascal fenster verwalten
BeitragVerfasst: Do Nov 03, 2005 16:32 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

ich brauch hilfe in ner sache die ich bisher nicht selbst lösen konnte.
Ich will folgendes machen:

Ne hauptapplikation welches Fenster (Dynamisch) verwaltet, botschaften verarbeitet, fenster am leben erhält, nachrichten abfängt usw.

Fenster müssen aber abhängig von Librarys hinzugefügt werden.
Also beispielsweise, will ich nen Hallo welt formular aus ner Library laden und dann mit der Hauptapp die botschaften verwalten.

Es soll aber auch möglich sein, neue Fenster zur Laufzeit zu erstellen zu können und zu zerstören.

Wichtig ist dabei: Es sollte so programmier sein, das es Platform unabhängig wird.
Es gibt zwar in lazarus ähnliche Eigenschaften wie unter Delphi, TForm und TApplication aber wie ich das mit den Librarys vereinen soll kein plan.

Was ich im grunde will ist einfach, ne Hauptanwendung die 3 Dynamische Librarys lädt.
Dann die 1. lib welches ein Fenster erstellt.
Dann ne 2. lib welches zwei fenster erstellt und dann ne 3 dritte welche 3 fenster erstellt.

Es sollte dann auch so laufen, wenn ich von einer library alle fenster schliesse, dann soll die Library entladen werden und die Hauptapp muss sich dann nur noch um die anderen 2 kümmern.

Wenn alle geschlossen werden, muss die Hauptapp sich selbst beenden.


Hoffe mal ihr habt verstanden wo es hängt,
bin für alle vorschläge dankbar,

Thx,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 13:17 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also da keiner gerafft hat was ich will hab ich mal schnell das in Delphi umgesetzt.
Eine Hauptapp und 3 DLL´s.

Einfach mal anschauen und damit rumexperementieren.

Ziel ist es, das die Hauptapplikation erst abgebrochen wird wenn alle Formulare der DLL´s zerstört sind.

Hier die binary + source (delphi): http://xenorate.com/final/sources/DynModTest.zip

und hier nen Screenshot:

http://xenorate.com/final/temppics/dyntest.JPG

Man beachte die titelleiste, für jedes Formular wurde ein eigener Eintrag hinzugefügt.
Das sollte natürlich nicht sein, ein einziger Eintrag ein der Taskleiste für die Hauptapp.
Die Formulare sollten in der Taskleiste nicht sichtbar sein !

und vor allem sollte das schliessen von formularen in einer lib, keine andere lib beeinflussen.


Danke schonmal fürs testen,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 14:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
vor der taskleiste verstecken kannst du ein fenster mit irgendeinem SetWindowLong-Aufruf. Hab hier mal was gefunden:

Code:
  1. ShowWindow(Application.Handle, SW_HIDE);
  2. SetWindowLong(Application.Handle, GWL_EXSTYLE,
  3.               GetWindowLong(Application.Handle, GWL_EXSTYLE) or
  4.               WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  5. ShowWindow(Application.Handle, SW_SHOW);


einfach das richtige handle übergeben, dann sollte das klappen.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 14:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Luke. Das geht noch einfacher. Du kannst in einer DLL auch das Application.Handle auf das Handle der Hauptanwendung setzen. Musst du mit an die DLL übergeben. Dann werden die Applicationobjekte irgendwie intern zusammengeschalten. Und entsprechend die Einträge verschwinden. Bzw ich meine sobald ein Dialog offen ist werden die anderen Fenster mit blockiert was so nicht der Fall wäre, da die Fenster keinen Zusammenhang haben.

Finalspace. Als Erstes darf dein Hauptformular kein Hauptformular mehr sein. Das muss ein unsichtbares Fenster sein. Sobald du dieses nämlich schließt wird unweigerlich deine Anwendung geschloßen werden. Wenn dies ein unsichtbartes Fenster ist wird deine Anwendung aber weiter leben, wuch wenn du das vermeindliche Hauptformular schließt. Erst wenn das richtige Hauptfenster weg ist wird deine Anwednung beendet.

Die Fenster aus den DLLs müssen sich registrieren und wenn sie geschlossen werden müssen sie die Registrierung löschen. Wenn du dann feststellst, dass kein Formular mehr da ist kannst du das Hauptformular schließen. Der Einfachheit halber sollte sich das vermeindliche Hauptform auch über die selbe Schnittstelle verwalten.

Wie das genau in Code aussehen würde hängt ganz von deiner derzeitigen Struktur und dem wie du es gerne hättest ab. Aber der grobe Aufbau sollte klar sein. Damit dürftest du hoffentlich etwas anfangen können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 07, 2005 15:28 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So hab das ganze jetzt mal so gemacht wies lossy gesagt hat und es funktioniert.
Allerdings bin ich noch nicht ganz glücklich mit.

1. So wies momentan programmiert läuft es nur mit Delphi und Windows.
Sollte aber vom grund prinzip her platform unabhängig sein. (kann ich aber mit leben vorerst)

2. Find ichs ein bischen doof, in den jeweiligen modulen via bool zu schauen welches bei den forms OnHide und OnShow gesetzt wird.

Ansonsten gehts jetzt, thx an alle bisher für antworten.

Falls noch irgendwer tips hat, kann die gerne posten.

Hier die aktuelle version: http://xenorate.com/final/DynModTest.zip


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 07, 2005 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was isn bei dir ersten und was ist zweitens? Erstens das Ding mit dem Taskbareintrag und zweites die Fenster?

Taskbar: Wenn Freepascal kein Applicationobjekt hat musst halt mal schauen was da ist. Kann dir dabei nur bei Delphi helfen.

Fensterverwaltung: Du könntest es auch so machen, dass du bei Initialisieren der Module einen Pointer auf eine Methode (Callback) an die Module übergibst. Und wenn die ihren Statusändern, dann rufen die die Methode auf. Aus deinem Hauptformular bekommst du dann auch genau mit, dass sich hier und da was getan hat. Dann brauchste nicht mehr pollen sondern bekommst die Infos gepushed.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 08, 2005 08:31 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Das mit den Callbacks ist ne gute idee, werde das so machen ;)

Also FreePascal selbst hat kein TApplication objekt, nur lazarus packt das dann dazu.
Allerdings ist mir das mit dem TApplication nicht recht, weil folgendes:

Diese Module sollen später unabhängig von Formularen usw sein.
Die Module können in jedem x-beliebigen Toolkit gebaut sein, Console (Win), Console (Unix), GTK, wxWindows, WinAPI und welche die einfach nur sone art hook darstellen usw.
Das muss irgendwie unabhängig werden.

Echt kein plan wie ich das so machen kann.

Ich könnte jetzt zwar hergehen und mein projekt weitermachen, allerdings kehr ich dann der Unix/Linux seite schon wieder den rücken.
Was ich eigentlich nicht will.

Aber ich machs denke ich mal so, ich progg jetzt mal so wie ichs mir vorstell mit dem TApplication und Callback prinzip und schau mal wie das so läuft.

Kann momentan eh kein FreePascal benutzen, da im fp compiler nen bug is welches verhindert das librarys gebaut werden :(

Danke,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 08, 2005 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Das Application benötigst du ja nur, wenn du ein Fenster hast. Und wenn das absolut unterschiedliche Schnittstellen sein dürfen, dann musst du halt auf das eingehen und das Application aus der Schnittstelle herrauslassen. Für eine Windows DLL kannst du ja zum Bleistifft auch mit GetWindowLong und SetWindowLong das AppWindow Flag entfernen. Das kannst du ja komplett in der DLL machen. Damit hättest du an dem Fall dein Kompatibilität gewahrt. Wie du das unter Linux machen kannst musst du selber wissen/herraus finden.

Du hättest zwar dann nicht mehr den Vorteil, dass alle Fenster geblockt wären sobald ein Dialog auf ist aber im Sinner der Kompatibilität sollte das ja schon machbar sein. Du musst schon selber wissen was du haben willst und das nicht. ;-)

Das Blocken könnte man evtl mit einer bestimmten Komunikation machen. Also du sagst den registrierten Modulen, dass sie Geblockt sein sollen und öffnest dann deinen Dialog. Wenn er wieder geschlossen ist, dann denblockst du sie. Evtl müssen die Fenster wenn sie Aktiviert (Windows OnActivate) werden, dann auch die Callback mit bestimmten Parametern aufrufen wodurch der Dialog wieder in den Vordergrund gebracht wird. Also Möglichkeiten gibt es wie immer reichlich. Das ist jetzt aber nur mal eben so dahingesagt. Wie es genau aussehen müsste etc hängt wie üblich noch von anderen faktoren ab. Aber für eine erste version kann man auf so etwas bestimmt auch verzichten. Nur solltest du das evtl im Hinterkopf behalten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 20, 2005 23:28 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also ich hab mich jetzt nochmal hingesetzt und mit Lazarus (FreePascal Delphi IDE) ne einfache Core app gemacht und ein Simples Interface module mit einem einzigen Formular drin.

Kämpfe schon das ganze weekend mit dem rotz, und auf teufel komm raus, egal was ich mit dem Form mache:
Memo drauf klebe, Farbe änder, es macht einfach was es will, ich setze im designer die Position auf left 5, top 5 beispielsweise.
Kompilier das ganze und es ist total wo anderst. Wenn ich farben ändere, dann werden diese auch nicht übernommen.
Zeichen über canvas geht ebenso wenig.
Buttons und Edits gingen irgendwie, panels gingen auch nicht :(

Also lazarus scheint noch nicht so ausgereift zu sein.

Hab das ganze unter Linux gemacht, entweder stimmt da der ganze gtk kram nicht oder FreePascal kommt mit Librarys nicht zurecht.

Da nen normale GUI app ohne lib, mit dem selben formular problemlos lief.
Ich verstehs nicht.

Naja, ich pfeif jetzt erstmal auf lazarus und code mein zeug nun endgültig mit delphi 5 unter windows.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]