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 form - verhalten / showmodal (https://www.delphipraxis.net/74172-form-verhalten-showmodal.html)

benicz 29. Jul 2006 15:05


form - verhalten / showmodal
 
Hallo!

folgende situation:
ich schreibe ein programm, das auf midi-events ragiert.

es gibt mehrere forms, die (wie die IDE es so macht) alle bei programmstart created werden.

im hauptformular gibt es einen menüpunkt, der ein zweites formular modal anzeigt.

die prozedur, die midi-events behandelt, tut das gleiche. (soll es zumindest...)

zuerst habe ich einfach die onclick-routine des menüpunktes aufgerufen, aber das hat nicht zum richtigen ergebnis geführt.
deshalb habe ich alle sachen, die erledigt werden müssen, in eine eigene funktion im zweiten formular gepackt, die dann an beiden stellen (onclick und midikram) identisch aufgerufen wird.

das problem:
das öffnen übers menü klappt vom feinsten,
per midi öffnet sich das fenster zwar, aber geht nicht wieder zu!

erläuterung zum midi-fall:
beim öffnen hat das zweite form nicht den fokus (der rahmen des fensters sagt mir das zumindest...)

im zweiten form gibt es einen button, der ein paar sachen macht und dann close aufruft.
die onclick-prozedur des knopfes läuft im stepping-modus (mitF7) auch brav durch, aber er scheint das close zu ignorieren...

ein weiteres phänomen:
die prozedur, die midi-events behandelt generiert (bei einem anderen event) auch den druck auf die enter-taste (keybd_event).
das funktioniert aber im zweiten form nur, wenn ich es übers menü öffne.


wow! ist ganz schön lang geworden, ich hoffe, dafür steht wenigstens alles drin...


disclaimer: ;-)
ich habe nach bestem gewissen erfolglos in foren und beiträgen gesucht, was in meinen augen diesen thread rechtfertigt!


besten dank schonmal für alle antworten!

marabu 29. Jul 2006 15:13

Re: form - verhalten / showmodal
 
Herzlich willkommen in der Delphi-PRAXiS, benicz.

Ein modales Form schließt du durch Zuweisung an die property ModalResult. Und ein Form per ShowModal aus einem midi event handler heraus anzuzeigen - ob das so gut ist?

Freundliche Grüße vom marabu

benicz 29. Jul 2006 15:27

Re: form - verhalten / showmodal
 
das midi-event wird von einem gerät erzeugt, das ich als eine art hardware-interface für mein programm baue, von daher:
unbedingt! ;-)

ja, das mit dem modalresult hab ich such schon versucht, hat aber am ergebnis nichts geändert...

ach ja, was ich doch tatsächlich vergessen habe:

dieses zweite fenster erzeugt sozusagen einen datensatz, der hinterher als item in einem treeview im hauptform erscheint.
durch doppelklick darauf öffnet sich dann wieder die form.

wenn man den datensatz per menü angelegt hat passiert das auch, per midi erstellt stürzt das programm ab...

ich habe überlegt, ob es daran liegt, dass ich bei midi ja keinen sender habe, aber mit "Form1" oder "nil" hat's auch nicht geklappt.
daraufhin habe ich die show-geschicht komplett isoliert, sodass jetzt der aufruf an beiden stellen exakt identisch ist.

ich versuche mal, etwas repräsentativen code zusammenzustricken...

benicz 29. Jul 2006 15:43

Re: form - verhalten / showmodal
 
hier der code (nur relevante befehle):

Delphi-Quellcode:
procedure Form1.domidi(const aStatus, aData1, aData2: byte);
begin
  URemote.doremote(aData1);
end;

procedure Form1.menucklick;
begin
  Form2.add;
end;

procedure URemote.doremote(aData1);
begin
  case aData1 of
  1: begin
       Form2.add;
       // das stammt noch aus der zeit, wo ich mangels sender den focus wieder auf Form1 setzen musste:
       Form1.SetFocus;
       Application.ProcessMessages;
     end;
  2: begin
       keybd_event(VK_RETURN,0,0,0);
       keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
     end;
  end;
end;

procedure Form2.add;
begin
  //dummy erzeugen
  if (Form2.edit(@dummy)=MROK) then
    mach weiter
    else
      exit;
end;

function Form2.edit(pointer):integer;
begin
  //setze globalen pointer auf den wert, der übergeben wurde
  result:=showmodal;
end;

procedure Form2.btokclick;
begin
  //trage den ganzen kram ein
  modalresult:=MROK;
  //oder close, klappt aber auch nicht...
end;
bevor ich jetzt noch länger dransitze und keiner antworten kann, poste ich mal...

huch, formatierung wech! dann müsst ihr euch die einschübe denken (oder mir sagen, wie leerzeichen drinbleiben...)

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

edit: yepp, danke!

marabu 29. Jul 2006 16:31

Re: form - verhalten / showmodal
 
Tut mir leid, aber da ist nichts in dem von dir gezeigten Code, was ein modales Anzeigen von Form2 in einer Ereignisbehandlungsroutine rechtfertigen könnte. Entweder du hast den wirklich wichtigen Code nicht gezeigt oder ich verstehe einfach nicht. Wenn das Anzeigen von Form2 keine Chance zur Interaktion bietet, dann wäre es besser die Form gar nicht erst anzuzeigen.

marabu

benicz 29. Jul 2006 16:38

Re: form - verhalten / showmodal
 
das "//trage den ganzen kram ein" sollte das, was es sonst noch so macht, ersetzen.

im grunde trägt es die daten, die in der maske (die die form2 darstellt) stehen, in den dummy ein.

ist das modalresult OK, dann wird der dummy endgültig eingatragen.

das halte ich aber für unwichtig, was mein problem angeht, ich hab halt nur das hingeschrieben, was mit dem öffnen und schließen zu tun hat...

modal soll's deshalb sein, damit man immer schön brav nur ein "objekt" ändern und nicht zwischendurch rumpfuschen kann...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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