![]() |
Mainmenu
Hi,
ich bin gerade dabei meine zig kleinen in eine einzige Großbaustelle umzuwandeln. :spin: Also verschiedene kleinere Programme in einem Menü-system zusammenzufassen. Also habe ich jetzt ein paar Menüpunkte und Untermenüs angelegt. Bereits beim ersten Menüpunkt, dem ich eine Aufgabe zuordnen wollte kommt beim anclicken eine Exception. Und zwar hier :
Code:
Da fehlt doch bestimmt irgendein create oder so ? Ist das so überhaupt richtig, das formShow in Onclick des Menuitems reinzusetzen ? Finde dazu nirgendwo ein kleines Bsp.
procedure TForm1.TestClick (Sender: TObject);
begin Form2.FormShow (Sender); end; Gruß Hansa |
schonmal mit
Code:
versucht?
uses unit2;
Gruß Jan |
Re: Mainmenu
Hi,
Zitat:
Gruß Hansa |
Hallo Hansa,
entschuldige, hätte ich wissen sollen :? Naja, aber jetzt mal zu dem wie ich es gemacht habe: ich habe in unit2 eine eigene Klasse definiert. Diese Klasse wird in unit1 wie folgt bereitgestellt:
Code:
In dieser Klasse ist eine Prozedur, welche ein form2.show oder form2.hide beinhaltet. Diese Prozedur kann ich dann in Unit1 Aufrufen.
procedure TForm1.FormCreate(Sender: TObject);
begin var1:=tklassenname.create; end; Ich habe keine Ahnung ob das jetzt viel zu umständlich ist, aber bei mir klappt es zumindest. Greetz Jan |
Hi Jan,
brauchst Dich doch nicht gleich zu entschuldigen. :oops: Hier ist wohl jeder froh, überhaupt was zu seinem Thema zu hören. Guck mal nach wieviele unbeantwortete Beiträge es gibt. Wobei allerdings in den meisten Fällen die Frage so unglücklich formuliert wurde, daß keiner was damit anfangen kann. zum Thema : Zitat:
Gruß Hansa |
Mach mal das Sender hinter FormShow weg. Das habe ich da noch nie gesehen.
|
Hallo Hansa,
also eine Klasse wird so erstellt:
Code:
Das ist jetzt eine Klasse aus einem älteren Programm von mir.
type
TDatensatz = class(TObject) private pose:integer; public Dateipfad:string; Karte : tKarteikarte; constructor create; procedure Schreiben; procedure Lesen; function datencheck:boolean; function Suchen(suchbegriff:shortstring; Itemindex, start:integer):boolean; procedure NeueDatei; procedure SetzePos(p:integer); function LesePos:integer; Function DateiEnde:integer; procedure Vor; procedure Zurueck; end; Jetzt könntest du da z.B. eine procedure showform einfügen. in der dann nur steht: form2.show . weiterhin dann musst du in der unit1 in die uses klausel unit2 aufnehmen und eine Variable in folgender Weise deklarieren:
Code:
Dann im oncreate-event von form1 folgendes:
var
myclass: tDatensatz; //in meinem Falle
Code:
Also das ist jetzt alles einfach nur streng so kopiert wie es bei mir funktioniert, aber eigentlich sollte es auch ohne eine Klasse gehen.
myclass:=tdatensatz.create;
Aber Klassen sind doch immer mal ganz nützlich, oder? Viel Erfolg Jan |
Hi,
@Luckie : das mit dem Sender stimmt schon, er compiliert ja auch. jetzt habe ich es einfach mal so machen wollen
Code:
Nur ich habe keinen Parameter vom Typ Tcomponent, der da hin muß. Ich mache das da irgendwie verkehrt rum. Jetzt muß ich auch noch weg. Es ist zum Mäuse melken.
Form2.Create ()
Gruß Hansa |
Hi,
@Jan : Du erweiterst doch nur die bestehende Klasse um einige Methoden. Dann würde ich doch immer noch die Methoden von der abgeleiteten Klasse benutzen können. Nee, das da bringt mich nicht weiter. Ich will ja nicht ein eigenes Show odeer Create von irgendwas ableiten. Die Form reicht völlig so wie sie ist. Gruß Hansa ............. Husch und weg ! |
Hallo Hansa,
ich weiß zwar nicht, ob's weiterhilft, aber ein ähnliches Problem funktioniert bei mir ohne Fehler. Ein Form FBrowser hatte mehr Funktionen, als dort hinein gehörten. Also hab ich ein neues Projekt angelegt, nennt sich FBrwRun. Da gibt's einen SpeedButton
Delphi-Quellcode:
mit FBrowser.FormStyle := fsNormal (im OI definiert)
procedure TFBrwRun.SpeedButton1Click(Sender: TObject);
begin FBrowser.Show; end; FBrowser ist unter uses eingebunden. Funktioniert ohne Create Vielleicht nützt es was. mfg eddy |
Hallo Hansa,
ich blicke durch das was du da gerade gesagt hast jetzt nicht ganz durch. Ich glaube du hast absolut nicht verstanden was ich gemacht habe, ich habe lediglich das form2.show in die unit2 verschoben und eine Procedure, die das form2.show verwendet von unit1 aus aufgerufen. Zitat:
Von form2.create war garnicht die Rede. Das Form1.create event erzeugst du, wenn du im form1 im OI unter Eigenschaften das oncreate event doppelklickst. darein schreibst du dann das, was ich oben schon geschrieben habe, und du musst auch keine neue Klasse erstellen, theoretisch kannst du die bereits vorhandene Form2-klasse aus unit2 auch verwenden und die Procedure einfach dieser Klasse hinzufügen, aber vergiss dann nicht die klasse auch zu in unit 1 zu definieren:
Code:
und:
var
classvar: tform2;
Code:
Ich hoffe, dass das jetzt verständlicher war, was ich gemeint habe.
procedure TForm1.FormCreate(Sender: TObject);
begin classvar:tform2.create; end; Gruß Jan |
Ich weiss nicht ob das hilft, aber ich create meine Forms erst wenn ich sie brauche und schmeiss sie weg, wenn ich sie nicht mehr brauche.
Also erstmal werden alle Forms(ausser das Hauptformular) aus Projekt/Optionen/Forms/AutoCreate entfernt bzw rechts rüber geschoben. Anschliessend erstell ich das jeweilige Formular, wenn ich es z.B. über ein Menü aufrufe, mit:
Code:
.. und schliesse es mit einem Schliessen-Button dem ich den Wert "ModalResult := mrOK" mitgebe, bzw direkt im Programmcode (in OnClose), wenn vorher noch was anderes ausgeführt werden soll.
Form1 := TForm1.Create(Application);
if Form1.ShowModal = mrOK then Form1.Release; Bei mir hat es sich zumindest schon mehrfach bewährt und die Programme startet auch noch schneller, da nur das geladen wird was man wirklich braucht. |
Hi,
das da sieht gut aus. So müßte das einwandfrei gehen. Werde es vielleicht heute noch testen. Nur : Wieso soll das Programm schneller starten ? Die EXE wird durch den zusätzlichen Code doch wohl nicht kleiner, oder worauf willst Du hinaus ? Gruß Hansa |
Die Exe wird nicht kleiner, aber so werden die Formulare erst geladen, wenn sie benötigt werden und nicht gleich alle beim Start deiner Anwendung.
|
Hi,
ist das so zu verstehen wie ein Overlay früher ? Gruß Hansa |
Hi X-Dragon,
als ich den Quelltext gesehen habe, ach hab ich doch schon gesagt, daß das für mich gut aussieht. Konnte es deshalb nicht lassen, das direkt auszuprobieren und sieh an zumindest die Form, die ich haben wollte ist da. Danach kommt zwar eine Exception, aber das ist bei StartTransaction. Vermute den Fehler deshalb eher bei SQL. Aber noch eine Frage : Wieso brauche ich das Release nur, falls ShowModal. Das blöde ShowModal kriege ich einfach nicht gepeilt. Kann mir das vielleicht mal einer so einfach erklären, daß ein absoluter NewBie es verstehen würde. Gruß Hansa |
Hi,
der Fehler ist wahrscheinlich geklärt. Datenbank-Pfad ist noch nicht definiert. Das kann ja nicht gehen. :oops: Das ShowModal kapiere ich irgendwie trotzdem nicht richtig. Gruß Hansa |
Wenn man ein Fenster "Modal" öffnet, ist automatisch nur dieses aktiv. Es ist also kein zugreifen aufs Hauptformular mehr möglich, bis das modal-geöffnete Unterformular geschlossen ist.
Zusätzlich kann man z.B. 2 Button aufs Fenster plazieren und diesen mit der Eigenschaften "ModalRessult" im Objektinspektor, ein Ergebniss mitgeben (mrOK/mrCancel/...). Also wenn ein Button mit ModalResult auf "mrOK" und der andere auf "mrCancel" eingetellt ist, wird automatisch beim drücken eines der Button, das Fenster geschlossen und dieser Wert jeweils übergeben. In meinem Beispiel wird bei "mrOK" der Befehl "Release" ausgeführt der das Fenster schliesst und vollständig aus dem Speicher entfernt. Man kann aber auch erstmal den normalen Programmcode abarbeiten, beim drücken eines Schliessen-Buttons (z.B. Daten speichern), und das Fenster dann mit
Code:
schliessen (wobei dann natürlich das Feld "ModalResult" bei dem Button leer sein muss).
ModalResult := mrOK;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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