Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Frame aus eigener Prozedur aufrufen (https://www.delphipraxis.net/186515-frame-aus-eigener-prozedur-aufrufen.html)

pmros 8. Sep 2015 20:25

Delphi-Version: 5

Frame aus eigener Prozedur aufrufen
 
Hallo und Hilfe - ich verzweifele!

Ich hab vor ca. 10 Jahren mal Delphi gelernt und seit dem wieder viel vergessen.

Jetzt sitze ich hier und versuche aus meiner eigenen Prozedur einen meiner Frames aufzurufen sieht in etwa so aus:

Code:
procedure CNCCommandBox (H:String);
begin
if (H ='H') then begin
FrameH.visible:=true;
FrameH.Left:=192;
FrameH.Top:=232;
end
Jetzt meckert Delphi über einen "Undeclared identifier: 'FrameH'".
Wenn ich
Code:
procedure CNCCommandBox (H:String; FrameH:TFrameH);
eingebe und beim Aufruf der Prozedur
Code:
CNCCommandBox(meineVariabel,FrameH)
dann ist alles gut.

Oder eben auch nicht, weil ich gerne in meiner Prozedur eine Abfrage hätte, mit der ich entscheide, welchen Frame ich aufrufe. So kann ich die Prozedur nur fest mit "FrameH" aufrufen, da ich auch keinen Framenamen als Variabel übergeben kann (String to TFrame gibts nicht und die Workarounds viel zu kompliziert).

Was kann ich tun?! Was mach ich falsch?!

PS: Delphi Version 7 - habe mich verklickt!

nahpets 8. Sep 2015 20:45

AW: Frame aus eigener Prozedur aufrufen
 
Wenn alle Frames von TFrame abgeleitet sind und Du nur Attribute benutzt, die auch bei TFrame vorhanden sind, dann könnte das funktionieren:
Delphi-Quellcode:
procedure CNCCommandBox (H:String; myFrame:TFrame);
Delphi-Quellcode:
procedure CNCCommandBox (H:String;myFrame:TFrame);
begin
  if (H ='H') then begin
    myFrame.visible:=true;
    myFrame.Left:=192;
    myFrame.Top:=232;
  end;
end;

pmros 8. Sep 2015 20:52

AW: Frame aus eigener Prozedur aufrufen
 
Danke für deine Antwort, aber

Delphi-Quellcode:
procedure CNCCommandBox (H:String;myFrame:TFrame);
begin
  if (H ='H') then begin
    myFrame.visible:=true;
    myFrame.Left:=192;
    myFrame.Top:=232;
  end;
end;
ist doch das gleich wie

Delphi-Quellcode:
procedure CNCCommandBox (H:String;FrameH:TFrame);
begin
  if (H ='H') then begin
    FrameH.visible:=true;
    FrameH.Left:=192;
    FrameH.Top:=232;
  end;
end;
Nur, dass TFrameH mit myFrame ausgetauscht wurde.

Das funktioniert ja auch, allerdings muss ich jetzt meine Prozedur eben mit
Delphi-Quellcode:
CNCCommandBox(Variabel,FrameH)
oder eben
Delphi-Quellcode:
CNCCommandBox(Variabel,myFrame)
aufrufen. Das möchte ich ja nicht. Ich will verhindern, dass ich erst zig IF Abfragen haben, wo bei jeder Möglichkeit ein anderer Frame an die Prozedur übergeben wird. Der jeweilige Frame soll über die übermittelte Variabel erst in der Prozedur ermittelt werden.

pmros 8. Sep 2015 20:59

AW: Frame aus eigener Prozedur aufrufen
 
Mir fällt gerade auf, dass ich auch auf die Edit Boxen auf meinen Frames über die Prozedur nicht zugreifen kann. Ich kann in meiner Prozedur von meiner MainForm eine ListBox über
Delphi-Quellcode:
FormMain.ListBoxCommands.Items[FormMain.ListBoxCommands.ItemIndex]
auslesen, den Wert aber nicht in meiner Prozedur per
Delphi-Quellcode:
FrameH.EditX.Text:=...
übergeben. Da hab ich wieder ein
Delphi-Quellcode:
[Error]Undeclared identifier: 'EditX'
...

Irgendwas mach ich doch grundlegend falsch.

BUG 8. Sep 2015 21:05

AW: Frame aus eigener Prozedur aufrufen
 
Hast du denn die Unit mit dem Frame in der Unit mit der Funktion eingebunden?

Langfristig könnte man versuchen, die Verzweigung durch ein Diktionary zu ersetzen, dass von einem String ("H") auf Objekte einer Superklasse der Frames abbildet.

nahpets 8. Sep 2015 21:06

AW: Frame aus eigener Prozedur aufrufen
 
Wie der Name des Frames ist, den Du der Prozedur übergibst, ist innerhalb der Prozedure "wurscht".
Alle übergebenen Frames werden innerhalb der Prozedure mit myFrame angesprochen.

Nehmen wir an, Du hast mehrere Frames, die da heißen:
Delphi-Quellcode:
FrameA, FrameB, ..., FrameH
alle kannst Du der Prozedure übergeben, eben mit:
Delphi-Quellcode:
CNCCommandBox(meineVariabel,FrameA);
CNCCommandBox(meineVariabel,FrameB);
...
CNCCommandBox(meineVariabel,FrameH);
In der Prozedure kannst Du sie alle über MyFrame ansprechen. Die Prozedure könntest Du z. B. so erweitern:
Delphi-Quellcode:
procedure CNCCommandBox(H:String;myFrame:TFrame);
begin
  if (H ='A') then begin
    myFrame.visible:=true;
    myFrame.Left:=1;
    myFrame.Top:=2;
  end else
  if (H ='B') then begin
    myFrame.visible:=false;
    myFrame.Left:=1;
    myFrame.Top:=2;
  end else
  if (H ='H') then begin
    myFrame.visible:=true;
    myFrame.Left:=192;
    myFrame.Top:=232;
  end;
end;

Sir Rufo 8. Sep 2015 21:11

AW: Frame aus eigener Prozedur aufrufen
 
Man sollte es sich so vorstellen
Delphi-Quellcode:
TGermanSpeaking = class
  procedure Say( AText: string );
end;

procedure TalkWith( AGermanSpeaking: TGermanSpeaking );
begin
  AGermanSpeaking.Say( 'Hallo' );
end;

var
  Peter, Klaus: TGermanSpeaking;

TalkWith( Peter );
TalkWith( Klaus );

pmros 8. Sep 2015 21:12

AW: Frame aus eigener Prozedur aufrufen
 
Zitat:

Zitat von BUG (Beitrag 1315176)
Hast du denn die Unit mit dem Frame in der Unit mit der Funktion eingebunden?

Langfristig könnte man versuchen, die Verzweigung durch ein Diktionary zu ersetzen, dass von einem String ("H") auf Objekte einer Superklasse der Frames abbildet.

Das habe ich. In der Unit, in der meine Funktion eingebunden ist habe ich testweise meinen Frame über einen Button aufgerufen, das funktionierte problemlos. Aber sobald ich das über meine eigene Funktion versuche(die in der gleichen Unit ist!!!), klappt es nicht mehr.

nahpets 8. Sep 2015 21:17

AW: Frame aus eigener Prozedur aufrufen
 
Zitat:

Zitat von pmros (Beitrag 1315175)
Mir fällt gerade auf, dass ich auch auf die Edit Boxen auf meinen Frames über die Prozedur nicht zugreifen kann. Ich kann in meiner Prozedur von meiner MainForm eine ListBox über
Delphi-Quellcode:
FormMain.ListBoxCommands.Items[FormMain.ListBoxCommands.ItemIndex]
auslesen, den Wert aber nicht in meiner Prozedur per
Delphi-Quellcode:
FrameH.EditX.Text:=...
übergeben. Da hab ich wieder ein
Delphi-Quellcode:
[Error]Undeclared identifier: 'EditX'
...

Irgendwas mach ich doch grundlegend falsch.

Bei der Übergabe von TFrame an die Prozedure sind innerhalb der Prozedure nur die Attribute bekannte, über die TFrame verfügt. Wenn FrameH von TFrame abgeleitet ist und dazu zusätzlich ein Edit bekommen hat, so ist dieses in der Prozedure nicht bekannt, dann muss die Prozedur geändert werden, funktioniert aber nicht mehr mit beliebigen Frames, sondern nur noch mit Frames vom Typ TFrameH und den davon abgeleiteten Varianten.
Delphi-Quellcode:
procedure CNCCommandBox(H:String;myFrame:TFrameH);
begin
  if (H ='A') then begin
    myFrame.visible:=true;
    myFrame.Left:=1;
    myFrame.Top:=2;
    myFrame.EditX.Text := 'A';
  end else
  if (H ='B') then begin
    myFrame.visible:=false;
    myFrame.Left:=1;
    myFrame.Top:=2;
    myFrame.EditX.Text := 'A²';
  end else
  if (H ='H') then begin
    myFrame.visible:=true;
    myFrame.Left:=192;
    myFrame.Top:=232;
    myFrame.EditX.Text := 'A³';
  end;
end;

pmros 8. Sep 2015 21:23

AW: Frame aus eigener Prozedur aufrufen
 
Zitat:

Zitat von nahpets (Beitrag 1315177)
Wie der Name des Frames ist, den Du der Prozedur übergibst, ist innerhalb der Prozedure "wurscht".
Alle übergebenen Frames werden innerhalb der Prozedure mit myFrame angesprochen.

Nehmen wir an, Du hast mehrere Frames, die da heißen:
Delphi-Quellcode:
FrameA, FrameB, ..., FrameH
alle kannst Du der Prozedure übergeben, eben mit:

Das habe ich verstanden, danke :) Allerdings will ich, dass der jeweilige Frame aufgrund der Variabel H ausgewählt wird. Deswegen will ich ja nur die Variabel H an die Prozedur übergeben und dann in der Prozedur über die Variabel entscheiden, welcher Frame gezeigt wird und welche Elemente auf dem jeweiligen Frame angesprochen werden.

pmros 8. Sep 2015 21:30

AW: Frame aus eigener Prozedur aufrufen
 
Zitat:

Bei der Übergabe von TFrame an die Prozedure sind innerhalb der Prozedure nur die Attribute bekannte, über die TFrame verfügt. Wenn FrameH von TFrame abgeleitet ist und dazu zusätzlich ein Edit bekommen hat, so ist dieses in der Prozedure nicht bekannt, dann muss die Prozedur geändert werden, funktioniert aber nicht mehr mit beliebigen Frames, sondern nur noch mit Frames vom Typ TFrameH und den davon abgeleiteten Varianten.
Mit TFrameH funktioniert es, danke. Aber wenn es dann nicht mehr mit beliebigen Frames funktioniert, ist das ein weiterer Grund für mich, keinen Frame Namen an die Prozedur zu übergeben, sondern erst in der Prozedur über die Variabel den jeweiligen Frame zu wählen - falls das überhaupt möglich ist.

nahpets 8. Sep 2015 21:39

AW: Frame aus eigener Prozedur aufrufen
 
Sorry, wenn ich es jetzt mal sehr flapsig formuliere:

Du möchtest in der Prozedure, abhängig vom Inhalte einer Zeichenfolge, auf einen Frame zugreifen, ohne ihr den Frame bekanntzumachen.

Das kann so erstmal nicht gehen.

Zeig' bitte mal den Quelltext, in dem Du die Prozedure hast und die Frames, sonst stochern wir hier im Dunklen oder reden unnützt aneinander vorbei. Eventuell ist die Lösung ja ganz einfach, wenn man sieht, was Du bisher schon hast.

BUG 8. Sep 2015 21:45

AW: Frame aus eigener Prozedur aufrufen
 
Zitat:

Zitat von nahpets (Beitrag 1315184)
Du möchtest in der Prozedure, abhängig vom Inhalte einer Zeichenfolge, auf einen Frame zugreifen, ohne ihr den Frame bekanntzumachen.

Ich vermute, das Problem ist, dass versucht wird, auf die automatisch angelegte globale Variable zuzugreifen, die aber nicht sichtbar ist.

nahpets 8. Sep 2015 21:54

AW: Frame aus eigener Prozedur aufrufen
 
Zitat:

Zitat von BUG (Beitrag 1315187)
Zitat:

Zitat von nahpets (Beitrag 1315184)
Du möchtest in der Prozedure, abhängig vom Inhalte einer Zeichenfolge, auf einen Frame zugreifen, ohne ihr den Frame bekanntzumachen.

Ich vermute, das Problem ist, dass versucht wird, auf die automatisch angelegte globale Variable zuzugreifen, die aber nicht sichtbar ist.

Exakt das ist das Problem.
Nur wie löse ich das, wenn ich den Quelltext dazu nicht kenne.

Eventuell könnte eine Änderung der Prozedure in der Form
Delphi-Quellcode:
procedure FormMain.CNCCommandBox(H:String);
und ihre Aufnahme in die Private-Deklarationen der Formulars mit
Delphi-Quellcode:
procedure CNCCommandBox(H:String);
ausreichen. Dann wird sie (vermutlich) auch alle Frames auf dem Formular kennen.

Die Prozedure könnte dann eventuell so aussehen:
Delphi-Quellcode:
procedure FormMain.CNCCommandBox(H:String);
begin
  if (H ='A') then begin
    FrameA.visible:=true;
    FrameA.Left:=1;
    FrameA.Top:=2;
    FrameA.EditX.Text := 'A';
  end else
  if (H ='B') then begin
    FrameB.visible:=false;
    FrameB.Left:=1;
    FrameB.Top:=2;
    FrameB.EditX.Text := 'A²';
  end else
  if (H ='H') then begin
    FrameH.visible:=true;
    FrameH.Left:=192;
    FrameH.Top:=232;
    FrameH.EditX.Text := 'A³';
  end;

pmros 8. Sep 2015 21:56

AW: Frame aus eigener Prozedur aufrufen
 
Ich kürz das mal etwas ab, damit ihr euch nicht durch den Quelltext kämpfen müsst:

Ich habe eine ListBox, die wird spaltenweise mit CNC-Code (für eine CNC-Fräse) befüllt. Das sieht dann in etwa so aus:

Code:
H X=100 Y=100 Z=19 Arbeitsfeld A
Beim Klicken auf diese Zeile wird der Frame aktiviert, der die jeweiligen Eingabefelder beinhalet, um die Werte X, Y, Z und Arbeitsfeld zu ändern. H gibt an, dass es sich um einen Header handelt, der die Plattenmaße auf der Fräse definiert.

Dann käme als nächstes z.B. die Zeile

Code:
G0 X=50 Y=50 Z=10 C=1 T=101
G0 bedeutet dann "Start einer Fräsbahn".

Meine Prozedur soll nun anhand der ausgelesenen ersten Zeichen (H, G0...) die ihr als Variabel übergeben wird, ermitteln welchen Frame sie zeigen soll und mit welchen Werten sie die auf dem befindlichen Frame gelegenen Eingabefeldern füllen soll.

Ich habe Programmcode, der die Zeilen zerlegt und in die Werte aufteilt und der soll ebenfalls in der Prozedur laufen, da anhand des gewählten Frames auch leicht geänderter Code zum Zerlegen laufen soll, da der CNC Code, den ich aus der ListBox auslese, mal mehr und mal weniger Werte hat.

pmros 8. Sep 2015 22:00

AW: Frame aus eigener Prozedur aufrufen
 
Zitat:

Nur wie löse ich das, wenn ich den Quelltext dazu nicht kenne.
Ach dafür hättest du den gebraucht...

Zitat:

Delphi-Quellcode:
procedure FormMain.CNCCommandBox(H:String);
begin
  if (H ='A') then begin
    FrameA.visible:=true;
    FrameA.Left:=1;
    FrameA.Top:=2;
    FrameA.EditX.Text := 'A';
  end else
  if (H ='B') then begin
    FrameB.visible:=false;
    FrameB.Left:=1;
    FrameB.Top:=2;
    FrameB.EditX.Text := 'A²';
  end else
  if (H ='H') then begin
    FrameH.visible:=true;
    FrameH.Left:=192;
    FrameH.Top:=232;
    FrameH.EditX.Text := 'A³';
  end;

Ja, so soll mein Code aussehen! Ich probier das jetzt erst einmal. Danke.

pmros 8. Sep 2015 22:05

AW: Frame aus eigener Prozedur aufrufen
 
nahpets Vorschlag hat funktioniert (sogar ohne Quelltext das Problem gelöst ;) )

allerdings heißt es
Delphi-Quellcode:
procedure TFormMain.CNCCommandBox(H:String);
Vielen Dank!

Sir Rufo 8. Sep 2015 22:16

AW: Frame aus eigener Prozedur aufrufen
 
Wenn dir dieses
Delphi-Quellcode:
if else
Schlangenmonster zu unhandlich wird, kannst du ja nochmal nachfragen, denn das geht auch insgesamt eleganter.

Alex_ITA01 8. Sep 2015 22:34

AW: Frame aus eigener Prozedur aufrufen
 
OffTopic...

@Sir Rufo:
zeigst du uns mal, wie du es lösen würdest? 8-)

Sir Rufo 8. Sep 2015 22:53

AW: Frame aus eigener Prozedur aufrufen
 
Grobes Rezept:
  • Für jeden Arbeitsschritt (H, G0, ...) eine Klasse (ableiten von einer Basisklasse, die wiederum von
    Delphi-Quellcode:
    TPersistent
    abgeleitet ist)
  • Für jede Klasse die
    Delphi-Quellcode:
    ToString
    Methode überschreiben (damit geht die Anzeige in der Listbox wie von selbst)
  • Lookup-Tabelle um zu der Datenklasse den passenden Frame zu finden
  • Datenklasse dem Frame per
    Delphi-Quellcode:
    Assign
    zuweisen
  • Eingaben aus dem Frame der Datenklasse per
    Delphi-Quellcode:
    Assign
    wieder zuweisen
Delphi-Quellcode:
var
  LFrame: TFrame;
  LData: TPersistent;

LFrame := FrameLookup.GetFrame( LData.ClassType );
LFrame.Assign( LData );
LFrame.Visible := True;

// Eingabedaten aus Frame übernehmen
LData.Assign( LFrame );
Vorteil: Ich brauche bei der Anzeige die konkrete Daten-/Frame-Klasse gar nicht kennen und kann die dadurch einheitlich behandeln.

Neue Daten-/Frame-Klassen lassen sich so einfach hinzufügen.

pmros 9. Sep 2015 10:31

AW: Frame aus eigener Prozedur aufrufen
 
Vermutlich reichen da die Kenntnisse nicht aus, die mir in einem Jahr reingewürgt worden sind :D Grundsätzlich ist das interessant, aber verlangt von mir intensiveres Befassen mit der Materie. Da ich aber auch mit meinen bescheidenen Mitteln (hoffentlich) zum Ziel kommen werde, überlass ich das mal anderen.


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