![]() |
was macht ein mausklick genau?
hallo!
ich habe, wie in vielen beiträgen auch empfohlen und eigentlich logisch, den code, der bei einem onclick-ereignis ausgeführt werden soll, in eine eigene prozedur ausgelagert, weil er an einer anderen stelle auch ausgeführt werden soll. es handelt sich hierbei um das öffnen einer zweiten form, in die ein datensatz eingegeben werden kann. der eine aufruf geschieht wie gesagt beim onclick eines menuitems, der zweite beim auftreten eines midi-events. (bei einigen klingelt's jetzt vielleicht: ich hab schonmal was hierzu gepostet, aber den großteil gelöst) wenn ich jetzt die zweite form über das menü öffne, geht das einwandfrei. wenn ich sie danach per midi-event öffne, auch. wenn ich es aber direkt per midi versuche (ohne vorher per mausklick), klappt's nicht. und immer, wenn ich es per midi mache, ist das zweite fenster trotz setfocus im hintergrund... mein verdacht: das message-handling. weil: wenn ich nach dem aufruf der öffnen-prozedur application.processmessages schreibe (in der midi-methode), zeigt er immerhin die objekte der form an (was er sonst nicht tut), und macht danach, bei erneutem midi-event, schritt für schritt alle eingaben, die ich zwischendurch mache (z. B. text in einem edit-feld markieren). das heißt für mich: ein klick-event macht irgendwas, das die weiterverarbeitung von messages erlaubt. und jetzt endlich die frage: ;-) was muss ich alles in die öffnen-prozedur schreiben, damit, egal, wie ich sie aufrufe, das gleiche passiert? oder: was muss ich alles beim midi-event vor deren aufruf erledigen? danke, ich bin echt am ende mit meinem latein :wall: edit: hier etwas code: ich schreib aber nur sachen rein, die das problem angehen, weil's sonst zu viel wird...
Delphi-Quellcode:
ich hoffe, ich hab nix vergessen... ;-)
{-------------------------------------------------------------------------------
domidiin: behandelt eingehende midi-events -------------------------------------------------------------------------------} procedure TForm1.DoMidiIn(const aDeviceIndex: integer; const aStatus, aData1, aData2: byte); begin if aStatus = $FE then Exit; //fernbedienungskram FSchalter.doremote(aStatus, aData1, aData2); end; procedure TForm1.Submanual1Click(Sender: TObject); begin FMandef.add; //die eine stelle des aufrufs end; {------------------------------------------------------------------------------- doremote: behandelt schalterbewegungen -------------------------------------------------------------------------------} procedure TFSchalter.doremote(aStatus,aData1,aData2:byte); begin FMandef.add; //und hier die andere. application.ProcessMessages; //ein versuch, da wird wenigstens angezeigt exit; end; procedure TFMandef.add; var y,z:integer; begin //dummy bauen neuman:=true; with temp do begin // hier schreib ich dann was in den dummy end; edit(@temp); end; procedure TFMandef.edit(zeiger :pointer); var z:byte; begin if visible then //weil ich nicht modal aufrufen darf, hier der blocker exit; p:=TPSubmanual(zeiger); //in TMandef globaler zeiger auf das zu bearbeitende objekt display; end; procedure TFMandef.display; begin //trägt alle sachen aus p in die felder im form ein, und dann show; end; procedure TFMandef.btokClick(Sender: TObject); begin if neuman then begin //neuen datensatz erstellen und mit dem dummy füllen, dann end; close; end; und bevor einwände kommen: die gegenseitigen uses-einträge sind richtig (er findet auf jeden fall alles und es läuft ja auch) ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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