![]() |
Problem: DBEdit/Edit Felder per Knopfdruck generieren
Guten Tag,
ich habe einpaar Fragen bezüglich der Erstellung von DBEdit/Edit Feldern, nachdem man eine beliebige Zahl in ein Editfeld eingetragen und auf einen Button geklickt hat: Ich erstelle über diese Möglichkeit Labels-, DBEdit-, Edit- und Memo-Felder. Mein erstes Problem besteht darin, dass ich bei der ersten Erstellung nach dem Programmaufruf zwar Felder erstellt bekomme, jedoch - zur selben Laufzeit - wenn ich nun neue Felder erstellen möchte, eine Fehlermeldung bekomme, dass es bereits schon Felder mit dem Namen gibt (ist ja prinzipiell logisch). Aber nun muss ich eine Möglichkeit suchen, die überprüft, ob bereits Felder mit dem Namen erstellt worden sind und wenn ja, diese Felder wieder löschen, wenn eben eine neue Anzahl von Feldern erstellt werden sollen. Ich hatte gedacht, dass ich mit dem Destruktor arbeiten kann, aber ich erhalte trotzdem eine Fehlermeldung, sicherlich, weil beim ersten Aufruf noch keine Felder erstellt worden sind. Und hier müsste ich eben vorher überprüfen, ob schon Felder vorhanden sind. Mein zweites Problem besteht darin, dass ich ein Feld erstellen lasse, welches aus zwei weiteren Feldern die Werte (Integer) berechnet und in dem erstellten Feld anzeigen soll. Aber wie greife ich auf das Feld zu, wenn ich es automatisch erstelle? Der Name des Feldes ist beispielweise bei einem Editfeld '"Edit_" + x' (wobei x für eine Zählvariable steht). Wenn ich im Code darauf zugreife, erhalte ich eine Fehlermeldung, dass es das Feld eben nicht gibt. Mein drittes Problem: Um anzuzeigen, um was für ein Feld es sich überhaupt handelt, erstelle ich zusätzlich noch Labels und fülle deren "Caption" mit Werten aus einem Array. D.h ich zähle die Anzahl der Einträge in dem Array und weise sie dann der Caption mit "ArrayName[x] (x = Zählvariable)" zu. Doch es werden irgendwie komische Zeichen mit angezeigt. Zurzeit ist es ein Pfeil nach oben gefolgt von einem C und einem K. Kann mir leider nicht erklären, weshalb diese Zeichen dort auftauchen. Mein Array enthält lediglich die Werte "Artikel", "Anzahl", "EP" und "GP". Ich hab schon rumprobiert und gesucht, aber ich zurzeit echt überfragt. Vielleicht kann mir jemand von euch vielleicht weiterhelfen ;) Danke schonmal im Voraus für jede Hilfe. Mit freundlichen Grüßen ShortyHL |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Versuch es mal mit .FindComponent()
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Zitat:
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Der Form.
Die Methode liefert dir ein TObject |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Ich erhalte einen Fehler "inkompatible Typen": String und TDBEDit...
var DBE: TDBEdit; if Form1.ScrollBox1.FindComponent(DBE) then begin [...] end; so korrekt? |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
FindComponent sucht dir eine Komponente anhand des Namens.
Delphi-Quellcode:
überprüft ob es eine Komponente eines bestimmten Namens schon existiert
if not Assigned(FindComponent('<Name der ges. Kompo>')) then
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
d.h. bei
Delphi-Quellcode:
müsste geprüft werden, ob das Objekt bereits erstellt wurde und wenn ja, wird es gelöscht?
var DBE: TDBEdit;
begin if not Assigned(Form1.FindComponent('DBE')) then DBE.Destroy; end; |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Assigned gibt false zurück, wenn P den Wert nil hat, andernfalls true.
das heißt du machst es genau umgekehrt. Wenn BDE nicht exisitiert, dann zerstöre es. irgendwie schwachsinnig.
Delphi-Quellcode:
if Assigned(Form1.FindComponent('DBE')) then FreeAndNil(DBE);
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Nein. DBE ist nur der Name der Variable nicht der des Objekts. DBE referenzirt in deinem Fall auch kein Objekt.
Zudem sollte man nie Destroy direkt sonder .Free aufrufen |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
@Noobinator: Das reicht aber auch nicht, denn die lokale Variable DBE ist nicht initialisiert worden. Richtig wäre es so:
Delphi-Quellcode:
var DBE: TComponent;
begin DBE := FindComponent('DBE'); FreeAndNil(DBE); //Assigned entfällt, da Free auf nil prüft end; |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Zitat:
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Hab es nun mal damit versucht, aber ich erhalte immer noch einen Fehler: "Konstanttyp kann nicht als Var-Parameter weitergegeben werden"
Delphi-Quellcode:
var DBE: TDBEdit; FreeAndNil(Form1.FindComponent('DBE')); |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Nochmal: FindComponent erwartet den Namen der Komponente, z.B. Edit1
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Aber dadurch, dass ich vorher nicht weiß, wie hoch die Anzahl der Kompenten ist, die erstellt worden sind, muss ich dann vorher prüfen, ob prinzipiell eine Komponente erstellt worden ist und dann wie viele insgesamtn erstellt wurden...
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Referenzen auf alle Komponenten befinden sich unter Form.Components, aller Controls unter Form.Controls
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Merk Dir doch einfach die Anzahl der dynamisch erstellten Komponenten (je Komponentenart).
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Aber meine Komponenten haben alle einen unterschiedlichen Namen: In Bezug auf Edit-Felder wären es dann "Edit_1", "Edit_2", usw..
Habe also eine Zählvariable... Edit: @DeddyH: Stimmt, das könnte ich probieren... |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Was ich sehe, sind Bezeichner und keine Zählvariablen.
[edit] Postings überschnitten :mrgreen: [/edit] |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Delphi-Quellcode:
Fehlermeldung:var DBE: TDBEdit; var y: Integer; begin Save_NumFields := NumFields; // NumFields wird mit der Funktion übergeben und ist eben die Anzahl der Felder, die erstellt werden sollen if not Assigned(DBE) then begin for y := 1 to Save_NumFields do begin FreeAndNil(Form1.FindComponent('DBEdit_' + IntToStr(y))); end; end; end; Ist die Zeile mit der Funktion FreeAndNil(); [Fehler] Unit1.pas(108): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Was soll denn bei Assigned() herauskommen? Versuch es mal so (schnell dahergetippt):
Delphi-Quellcode:
var DBE: TDBEdit;
var y: Integer; begin Save_NumFields := NumFields; // NumFields wird mit der Funktion übergeben und ist eben die Anzahl der Felder, die erstellt werden sollen // if not Assigned(DBE) then begin for y := 1 to Save_NumFields do begin DBE := Form1.FindComponent('DBEdit_' + IntToStr(y)); FreeAndNil(DBE); end; // end; end; |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
[Fehler] Unit1.pas(108): Inkompatible Typen: 'TDBEdit' und 'TComponent' in der Zeile:
Delphi-Quellcode:
DBE := Form1.FindComponent('DBEdit_' + IntToStr(y));
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Delphi-Quellcode:
var DBE: TComponent;
var y: Integer; begin Save_NumFields := NumFields; // NumFields wird mit der Funktion übergeben und ist eben die Anzahl der Felder, die erstellt werden sollen // if not Assigned(DBE) then begin for y := 1 to Save_NumFields do begin DBE := Form1.FindComponent('DBEdit_' + IntToStr(y)); if (DBE is TDBEdit) then FreeAndNil(DBE); end; // end; end; |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Das wird den Fehler aber nicht beheben, da die betroffene Zeile
Delphi-Quellcode:
ist
DBE := Form1.FindComponent('DBEdit_' + IntToStr(y));
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
DBE ist jetzt aber TComponent.
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
und genau das verursacht ja den Fehler..
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Zitat:
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Oh, hatte die Variablendeklaration übersehen.. Ok, klappt nun, allerdings spuckt meine weitere Funktion nun Fehler aus, weil sämtliche Methoden nicht mehr verfügbar sind...
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Wenn Du die Zeile
Delphi-Quellcode:
drinlässt, kannst Du doch anschließend explizit auf TDBEdit casten.
if (DBE is TDBEdit) then
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Hm, ich glaub, ich kann nicht ganz nachvollziehen, was du meinst. Hab versucht, es so umzusetzen, wie du meintest, aber bin zu keine positiven Ergebnis gekommen.
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Das ist zu kompliziert für Dich, denke ich mal.
Du willst also dynamische Controls erstellen und musst vorher einen eindeutigen Namen zuweisen? Entweder ich pflege eine Zählvariable für alle Controlklassen, oder für jede Klasse einen eignen, oder ich spare mir das und verwende zufällige Zeichenfolgen und drücke die Daumen, das ich keine Kollision habe. Oder ich erzeuge so lange einen Namen (Klassenname+Zähler), bis ich einen gefunden habe, der noch nicht vergeben ist.
Delphi-Quellcode:
Dieser (ziemlich dämlliche aber funktionierende Code) liefert einen 20-stelligen Namen, den man einem Control zuweisen kann.
Function TForm1.CreateUniqueControlName : String;
Const sAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; Var i : Integer; Begin setLength (Result,20); Repeat For i=1 to Length (Result) Do Result[i] := sAlphabet[Random(Length (sAlphabet) + 1]; Until Not Assigned (FindComponent (Result)); End; So kann man es auch machen, aber das ist schon etwas langsam:
Delphi-Quellcode:
Diese Funktion liefert einen etwas hübscheren Namen (Klassenname + fortlaufende Nummer).
Function TForm1.CreateUniqueControlName (aClassName : String = 'Ctl') : String;
Var Cnt : Integer; Begin Cnt := 0; Repeat Inc (Cnt); Result := aClassName+IntToStr(Cnt); Until Not Assigned (FindComponent (Result)); End; |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Mit dem Casten meine ich so was in der Art:
Delphi-Quellcode:
TDBEdit(DBE).Text
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Ich bräuchte schon eindeutige Namen, die Feldwerte später in eine Datenbank eingetragen werden sollen. Da muss ich ja auch nochmal auf diese Felder zugreifen. Es wird prinzipiell später ein kleines Rechnungsprogramm, bei dem der Anwender die Möglichkeit hat, vorher anzugebenl, wie viele Artikel er auf dieser Rechnung angeben will. Daher die individuelle Felderstellung.
D.h. nach dem der Anwender beispielsweise eine "3" eingibt, werden folglich insgesamt 3 Feldpakete (bestehend aus Artikel, Anzahl, Einzelpreis und Gesamtpreis) erstellt. |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Finde ich ein wenig umständlich, diese Vorgehensweise. Wieso nicht einfach ein Eingabeformular mit einer Schaltfläche für "Neuanlage Position" und einer für "Fertig mit der Eingabe"?
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
So könnte man es auch machen, ich werd es mal umsetzen...
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Was sagt mir die Fehlermeldung "Zugriffsverletzung bei Adresse 00404857 in Modul "Project2.exe". Lesen von Adresse 00000000" ?
Habe nun anstatt eines Editfeldes, in dem ich einen Wert zur Erstellung der Feldpakete, zwei Buttons eingefügt, mit denen man jeweils ein Feldpaket hinzufügen bzw. entfernen kann. Beim Hinzufügen wird das erste Feldpaket erstellt, danach kommt dann diese Fehlermeldung. Die Zeile ist der Aufruf der Funktion (In dieser Funktion geschieht die gesamte Erstellung der einzelnen Felder + Ausrichtung und Bennenung). |
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Es scheint so, als ob Du auf ein Objekt zugreifst, das noch nicht instanziiert wurde.
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Aber dadurch, dass es über eine Funktion aufgerufen und schonmal erstellt wurde, muss ja bei einem erneuten Durchlauf genauso instanziert werden.
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Zeig doch mal die Stelle, an der der Fehler auftritt.
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Delphi-Quellcode:
Create_Fields(0, 5, 16, 121, 21, ''); //Modus(0=Hinzufügen/1=Entfernen), Left, Top, Width, Height, Text/Caption
|
Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
Und wie sieht CreateFields aus?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz