Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Form zu einer "Gruppe" zuweisen? (https://www.delphipraxis.net/50700-form-zu-einer-gruppe-zuweisen.html)

VT-DA 29. Jul 2005 23:21


Form zu einer "Gruppe" zuweisen?
 
Hi,

Nach längerem suchen ohne Erfolg, gebe ich hiermit auf und stelle erneut einen noobigen Thread.
Ich habe ein Fenster erstellt. Dieses Fenster ist mein "Mainform". So. Nun möchte ich ein zweites Fenster erstellen was zu dieser Gruppe hinzugefügt wird. Also z.B. wenn man dass MainFnester schließt, schließt sich das andere Fenster auch. Halt ein Hauptfenster. Nur mein Problem ist, dass ich nicht weiß wie ich das andere Fenster zu dem Mainfenster hinzuufügen soll?
Ich habe versucht beim erstellen des Fensters einfach den Handel dabei anzugeben.
Doch irgendwie wird das Fenster noch in der Taskleiste angezeigt was es eigentlich nicht dürfte.
Außerdem bleibt das Fenster offen wenn man das Hauptfenster schließt.

Mfg

Olli 30. Jul 2005 00:15

Re: Form zu einer "Gruppe" zuweisen?
 
Das Schließen mußt du schon selber und explizit machen. Also zB vom ersten das zweite Fenster schließen.

VT-DA 30. Jul 2005 14:16

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

hmm. Okay. Trodzdem weiß ich aber noch nicht wie ich das andere Fenster zu einer Gruppe machen soll. :gruebel:

Mfg

Olli 30. Jul 2005 14:33

Re: Form zu einer "Gruppe" zuweisen?
 
Zitat:

Zitat von VT-DA
Trodzdem weiß ich aber noch nicht wie ich das andere Fenster zu einer Gruppe machen soll. :gruebel:

Erklär mal, was du unter Gruppe verstehst. Dieser Begriff ist mir komplett neu und ich arbeite schon ein paar Jahre mit der Win32-API!

VT-DA 30. Jul 2005 14:38

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

Also ich nehme mal Delphi als beispiel. Bei Delphi sind ja mehrere Fenster. Zum beispiel einmal ein Form oder halt der Object Inspector... Doch unten in der Leite siehst du ja nur ein Programm. Delphi. Normaler weise sind dann ja drei Fenster zu sehen weil die ja eigeständig sind. Aber das Programm wird unten als ein ganzes angezeigt und wenn man oben die Hauptleiste schließt, schließen sich auch automatisch alle anderen Fenster. Da ich ja alles aus einer DLL hole ist es ja nicht so...

Mfg

malo 30. Jul 2005 14:51

Re: Form zu einer "Gruppe" zuweisen?
 
In der Titelleiste schließt du das MainForm (ist glaub ich bei Delphi die Menuleiste oben...). Wenn das MainForm geschlossen wird, ist das Programm geschlossen. Und dabei werden ALLE Fenster geschlossen, die zu deinem Programm gehören.

VT-DA 30. Jul 2005 16:04

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

Ja. Aber ja nicht wenn ich eine DLL erstelle und die dann in einer anderen Programmiersprache öffne.
Dort sind dann zwei Fenster aufgelistet. Auch wenn ich ein Projekt als "Form" öffne gehts auch so.Ich brauche halt einen Befehl oder einen Parameter wo das halt sozusagen Manuell geht.

Mfg

DBR 30. Jul 2005 16:10

Re: Form zu einer "Gruppe" zuweisen?
 
Falls du nicht scheust, das von Hand zu machen, nimm den folgenden Code. Beide Fenster werden zusammen geöffnet, sind zusammen aktiv und werden zusammen minimiert. Weitere Dinge kannst du ja selbst einbauen.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Forms, Dialogs, StdCtrls, Controls, Messages;

type

  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    procedure Minimieren(var M: TMessage); message WM_NCLBUTTONDOWN;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses Unit2;

procedure TForm1.FormActivate(Sender: TObject);
begin
  sendmessage(Form2.handle, WM_NCACTIVATE, 1, 0);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.Title := 'Gruppe W1';
  Caption := Application.Title;
end;

procedure TForm1.Minimieren(var M: TMessage);
begin
  DefaultHandler(M);
  if M.WPARAM = HTREDUCE then
    Form2.windowstate := wsminimized;
end;

end.

--------------------------------------------------------------
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm2 = class(TForm)
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    procedure CreateParams(var Params: TCreateParams); override;
    procedure Minimieren(var M: TMessage); message WM_NCLBUTTONDOWN;
  end;

var
  Form2: TForm2;

implementation

{$R *.DFM}

procedure TForm2.FormActivate(Sender: TObject);
begin
  sendmessage(Application.Mainform.handle, WM_NCACTIVATE, 1, 0);
end;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := GetDesktopWindow;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.MainForm.close;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Caption := 'Gruppe W2';
end;

procedure TForm2.Minimieren(var M: TMessage);
begin
  DefaultHandler(M);
  if M.WPARAM = HTREDUCE then
    Application.minimize;
end;

end.
-------------------------------------------

Gruß DBR

[edit=alcaeus]Delphi-Tags eingefuegt. In Zukunft bitte selbst machen. Mfg, alcaeus[/edit]

Olli 30. Jul 2005 16:43

Re: Form zu einer "Gruppe" zuweisen?
 
Das in der Taskleiste ist ein Fenster (Application.Handle) welches du sonst garnicht zu sehen bekommst. Es hat nichts mit den Forms (wieviele auch immer) zu tun.
Der Grund warum es in der Taskleiste angezeigt wird ist, daß der Stil WS_EX_APPWINDOW gesetzt ist.

VT-DA 30. Jul 2005 19:15

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

hmm. Danke aber so wichtig ists dann doch nicht. Ich habe auch mal versucht nochmal mit handel.Parent das Fenster zu dem Mainfenster hinzuzufügen doch dann ist das Fenster in dem anderem Fenster und das will ich ja nicht. Naja. Egal. Trodzdem danke nochmal.

Mfg

Olli 30. Jul 2005 20:22

Re: Form zu einer "Gruppe" zuweisen?
 
Ähem ... machst du das hier nur als Beschäftigungstherapie für uns, oder eigentlich für dich? In letzterem Fall solltest du versuchen hartnäckig zu bleiben. Das hilft immer am besten um neues zu lernen.

VT-DA 30. Jul 2005 21:17

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

Okay. Du hast recht. Nur mein Problem ist, dass ich nix versteh von dem Code der oben gepostet wurde.
Könnte mir nicht wenigstens einer die Stelle markieren wo odas abläuft der wie das Funktioniert?

Mfg

Olli 30. Jul 2005 21:33

Re: Form zu einer "Gruppe" zuweisen?
 
Was genau am Code verstehst du nicht?

Leicht OT (aber eventuell nötig):
Also, mal ein paar Grundlagen zu einem Forum. Keine Angst, habe dein Alter zur Kenntnis genommen, nimm es mir nicht krumm, wenn nicht alles sanft genug rüberkommt.
In einem Forum helfen dir Leute freiwillig. Meistens haben diese Leute noch andere Dinge zu tun (zB könnten sie beruflich mit Delphi zu tun haben). Daher solltest du deine Frage präzise stellen. Sie sollte auch mehr dein Ziel (in verständlichen Worten) beschreiben, als das was du bereits getan hast. Wenn Details deiner aktuellen Implementierung benötigt werden, wirst du danach gefragt werden. Ansonsten wird man dir (meistens) eine zielgerichtete Antwort geben. Ohne das Ziel zu kennen, kann man als alter Hase zwar mutmaßen, aber das war's auch schon.

Außerdem setzen wir voraus, daß du deine "Hausaufgaben" machst. Wenn du also sagst, daß du den kompletten Code oben nicht verstanden hast, solltest du dich nochmal reinvertiefen. Wenn du Bücher zum Lernen brauchst, kann man sicher auch was machen, selbst wenn du keine Bibliothek in deiner Nähe hast.

Übrigens: wenn dein Alter stimmt, so fällt mir schonmal deine Rechtschreibung äußerst positiv auf. Es gibt hier Erwachsene, die pro Satz mehrere Fehler machen (ich rede mal nicht von neuer vs. alter Rechtschreibung ;)).

PS: Wenn du also ein Buch brauchst, so könnte ich dir zB vermutlich ein Delphi-4-Buch (D6 habe ich auch noch) ausleihen.

VT-DA 30. Jul 2005 22:03

Re: Form zu einer "Gruppe" zuweisen?
 
Hi Olli,

ich bin nicht das erste mal in einem Forum. Trodzdem danke das du mich sozusagen einweißt. ;)
Also. Ich verstehe den Code wohl oben. Was ich nur ausdrücken wollte, war das ich nicht die Stelle finde wo das Passiert was ich möchte. Also halt eine Gruppeneinteilung der beiden Fenster. Du sagtes oben auch schon das der Stil WS_EX_APPWINDOW dran Schuld wäre ob das Fenster in der Taskleiste angezeigt wird oder nicht. Nur leider sehe ich in dem Code, der oben angezeigt wurde, keine Stelle wo das drin vorkommt. Somit hast du mich glaub ich ein wenig verwirrt. ;)

Mfg

Olli 30. Jul 2005 22:10

Re: Form zu einer "Gruppe" zuweisen?
 
Zitat:

Zitat von VT-DA
ich bin nicht das erste mal in einem Forum.

:oops:

Zitat:

Zitat von VT-DA
Also. Ich verstehe den Code wohl oben. Was ich nur ausdrücken wollte, war das ich nicht die Stelle finde wo das Passiert was ich möchte. Also halt eine Gruppeneinteilung der beiden Fenster. Du sagtes oben auch schon das der Stil WS_EX_APPWINDOW dran Schuld wäre ob das Fenster in der Taskleiste angezeigt wird oder nicht. Nur leider sehe ich in dem Code, der oben angezeigt wurde, keine Stelle wo das drin vorkommt. Somit hast du mich glaub ich ein wenig verwirrt. ;)

Naja, der Stil ist auch direkt in der Win32-API und obiges Beispiel ist VCL-basiert. Allerdings sehe ich auch nicht das exakte Beispiel welches du willst (also mit Schließen). Allerdings habe seinen Code noch nicht probiert. Hast du ihn schon probiert?

Dir geht es doch im Grunde darum, daß nur ein Fenster in der Taskleiste angezeigt wird, selbst dann wenn du andere Forms erstellst? Oder reden wir über nonVCL. Das kam in deiner Fragestellung nämlich noch nicht zu Wort.

VT-DA 30. Jul 2005 22:16

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

Also das ganze ist nonVCL soweit ich das beurteilen kann. :)
Ich habe halt eine DLL und dort ist eine function.
Ich rufe also mit der anderen Programmiersprache diese function auf.
Bei dem Aufrufen übergeb ich noch Breite, höhe, x, y, groupe.
Die Gruppe soll halt bewirken dass man mehrere MainFenster erstellen kann.

Den Code habe ich schon ausprobiert. Ich habe ihn auch schon mehrfach analisiert.
Doch ich finde halt nicht die Stelle oder den Befehl der das bewirkt.
Vllt fehlt mir ja wirklich das Hintergrundwissen. :gruebel:

Mfg

Olli 30. Jul 2005 22:24

Re: Form zu einer "Gruppe" zuweisen?
 
Zitat:

Zitat von VT-DA
Die Gruppe soll halt bewirken dass man mehrere MainFenster erstellen kann.

Okay. Und was ist diese Gruppe? Wird die von deiner anderen Programmierumgebung festgelegt? Auf API-Ebene gibt es das nämlich nicht?

Was ist bei dir ein "MainFenster"? Habe ich richtig verstanden, daß du folgendes willst:
- Wird ein MainFenster geschlossen, wird die Anwendung beendet
- Alle MainFenster erscheinen auf der Taskleiste
???

VT-DA 30. Jul 2005 22:28

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

Du kannst MainFenster erstellen.
Und du kannst ein Fenster zu diesem MainFenster hinzufügen.
Wenn also ein Mainfenster geschlossen wird, wird nur das Mainfenster und die Fenster die zu dem MainFenster zugeordnet wurden geschlossen.
Dazu gehört aber auch noch, dass die Fenster, die zu dem Mainfenster zugeordnet wurden, nicht in der Taskleiste angezeigt werden. Es werden also nur die Mainfenster in der Taskleiste angezeigt.
Das ist eigentlich alles. :)

// Edit
Die Groupen sind nur imaginär. Also sind sozusagen von mir erfunden. :)

Mfg

Olli 30. Jul 2005 22:35

Re: Form zu einer "Gruppe" zuweisen?
 
Wäre dann nicht MSDN-Library durchsuchenMDI (Delphi-Referenz durchsuchenMDI) was für dich? Dort sind die Fenster immer untergeordnet.

VT-DA 30. Jul 2005 23:03

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

hmmm. Wie genau funktioniert das und wie genau gehe ich damit um?
Sorry aber darin bin ich absoluter vollnoob.

Mfg

jbg 31. Jul 2005 09:39

Re: Form zu einer "Gruppe" zuweisen?
 
Zitat:

Ich habe halt eine DLL und dort ist eine function.
Dazu zwei Fragen:

1. Hast du ShareMem im Hauptprogramm und in der DLL als aller erste Unit in der .dpr Datei eingefügt? (Wenn nicht kracht es irgendwann während das Programm läuft)

2. Du erstellt das zweite Formular in der DLL mit Hilfe dieser Funktion? Oder ist der DLL-Code nicht von dir und du willst ihn nur nutzen?

Wenn du die Macht über den DLL-Code hast, dann kannst du das Formular (sofern VCL) in die Hauptanwendung einfügen, indem du vor dem Erzeugen des Formulars das Application.Handle auf die der Hauptanwendung setzt.
Delphi-Quellcode:
function CreateDllForm(AppHandle: THandle): TForm;
begin
  Application.Handle := AppHandle;
  Result := TMyForm.Create(Application);
end;
Stammt das Formular nicht von dir, oder ist kein VCL Formular dann kannst du es an die Anwendung ankoppeln mit
Delphi-Quellcode:
SetWindowLong(w, GWL_HWNDPARENT, Application.Handle);

VT-DA 31. Jul 2005 11:15

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

Also. Es gibt kein Hauptprogramm und es gibt auch keine unit. Es gibt nur die DLL wo alle Fenster erstellt werden und dann nachher in der anderen Programmiersprache geladen werden.
Deswegen werden auch alle Fenster in der DLL erstellt.
Das heißt es müsste die erste Variante klappen.
Ich probiers also mal aus. danke. :)

Mfg

VT-DA 31. Jul 2005 13:03

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

hmm. Irgendwie klappt alles nicht.
Ich hab jetzt mal nen Beispiel gemacht.
Vllt bringt das ja was?

Delphi-Quellcode:
library Gruppe;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

var Form1, Form2: TForm;

{$R *.res}

procedure CreateDllForm; stdcall;
begin
  Form1 := TForm.Create(Application);
  Application.Handle := Form1;
  Form2 := TForm.Create(Application);
end;

procedure CreateForm; stdcall;
begin
  Form1 := TForm.Create(Application);
  Form2 := TForm.Create(Application);
  SetWindowLong(Form1, GWL_HWNDPARENT, Application.Form2);
  Form1.Show;
  Form2.Show;
end;

exports
  CreateForm, CreateDLLForm;

begin
end.
Mfg

jbg 31. Jul 2005 14:33

Re: Form zu einer "Gruppe" zuweisen?
 
Du hast wohl nocht nicht den Unterschied zwischen Handle und Form herausgefunden. Wenn dann schon Form.Handle benutzen, auch wenn es dann trotzdem falsch ist.

In deinem Fall rate ich statt "Form1 := TForm.Create(Application)" zu "Application.CreateForm(TForm, Form1)" denn damit weiß die Anwendung, dass das erste Formular als Hauptfenster zu betrachten ist. Der SetWindowLong brauchst du dann nicht mehr.

VT-DA 31. Jul 2005 22:23

Re: Form zu einer "Gruppe" zuweisen?
 
Hi,

Hui. Jetzt klappts. Recht herzlichen dank. :)

Mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr.

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