Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem: DBEdit/Edit Felder per Knopfdruck generieren (https://www.delphipraxis.net/109791-problem-dbedit-edit-felder-per-knopfdruck-generieren.html)

ShortyHL 7. Mär 2008 17:18


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

mkinzler 7. Mär 2008 17:20

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Versuch es mal mit .FindComponent()

ShortyHL 7. Mär 2008 17:44

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Zitat:

Zitat von mkinzler
Versuch es mal mit .FindComponent()

Und was für eine Komponente füge ich in die Funktion ein? Zurzeit gibt es eine Fehlermeldung mit inkompatiblen Typen bzw. wenn ich daraus eine Anweisung mache, erfordert der Ausdruckstyp BOOLEAN. Füge ich dahinter ein "= true", hab ich auf einmal inkompatible Typen?

mkinzler 7. Mär 2008 18:00

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Der Form.
Die Methode liefert dir ein TObject

ShortyHL 9. Mär 2008 12:54

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?

mkinzler 9. Mär 2008 13:58

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
FindComponent sucht dir eine Komponente anhand des Namens.
Delphi-Quellcode:
if not Assigned(FindComponent('<Name der ges. Kompo>')) then
überprüft ob es eine Komponente eines bestimmten Namens schon existiert

ShortyHL 9. Mär 2008 14:18

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
d.h. bei

Delphi-Quellcode:
var DBE: TDBEdit;

begin


  if not Assigned(Form1.FindComponent('DBE')) then DBE.Destroy;

end;
müsste geprüft werden, ob das Objekt bereits erstellt wurde und wenn ja, wird es gelöscht?

Noobinator 9. Mär 2008 14:24

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);

mkinzler 9. Mär 2008 14:25

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

Apollonius 9. Mär 2008 14:26

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;

Noobinator 9. Mär 2008 14:30

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Zitat:

Zitat von Apollonius
@Noobinator: Das reicht aber auch nicht, denn die lokale Variable DBE ist nicht initialisiert worden. Richtig wäre es so:
....

Ich habe den Post ja auch nur überflogen und das ist mir direkt ins Auge gesprungen :lol:

ShortyHL 10. Mär 2008 13:08

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'));

mkinzler 10. Mär 2008 13:13

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Nochmal: FindComponent erwartet den Namen der Komponente, z.B. Edit1

ShortyHL 10. Mär 2008 13:36

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...

mkinzler 10. Mär 2008 13:39

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Referenzen auf alle Komponenten befinden sich unter Form.Components, aller Controls unter Form.Controls

DeddyH 10. Mär 2008 13:40

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Merk Dir doch einfach die Anzahl der dynamisch erstellten Komponenten (je Komponentenart).

ShortyHL 10. Mär 2008 13:50

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...

DeddyH 10. Mär 2008 13:51

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Was ich sehe, sind Bezeichner und keine Zählvariablen.

[edit] Postings überschnitten :mrgreen: [/edit]

ShortyHL 10. Mär 2008 14:43

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
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

                                FreeAndNil(Form1.FindComponent('DBEdit_' + IntToStr(y)));

                        end;

                end;

end;
Fehlermeldung:
Ist die Zeile mit der Funktion FreeAndNil();

[Fehler] Unit1.pas(108): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden

DeddyH 10. Mär 2008 14:55

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;

ShortyHL 10. Mär 2008 14:57

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));

DeddyH 10. Mär 2008 15:02

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;

ShortyHL 10. Mär 2008 15:04

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Das wird den Fehler aber nicht beheben, da die betroffene Zeile
Delphi-Quellcode:
DBE := Form1.FindComponent('DBEdit_' + IntToStr(y));
ist

DeddyH 10. Mär 2008 15:05

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
DBE ist jetzt aber TComponent.

ShortyHL 10. Mär 2008 15:22

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
und genau das verursacht ja den Fehler..

DeddyH 10. Mär 2008 15:28

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Zitat:

Zitat von Delphi-Hilfe
function FindComponent(const AName: string): TComponent;

Also muss sich DBE zuweisen lassen, wenn man es als TComponent deklariert.

ShortyHL 10. Mär 2008 15:33

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...

DeddyH 10. Mär 2008 15:37

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Wenn Du die Zeile
Delphi-Quellcode:
if (DBE is TDBEdit) then
drinlässt, kannst Du doch anschließend explizit auf TDBEdit casten.

ShortyHL 10. Mär 2008 17:03

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.

alzaimar 10. Mär 2008 17:44

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:
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;
Dieser (ziemlich dämlliche aber funktionierende Code) liefert einen 20-stelligen Namen, den man einem Control zuweisen kann.

So kann man es auch machen, aber das ist schon etwas langsam:
Delphi-Quellcode:
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;
Diese Funktion liefert einen etwas hübscheren Namen (Klassenname + fortlaufende Nummer).

DeddyH 10. Mär 2008 17:45

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Mit dem Casten meine ich so was in der Art:
Delphi-Quellcode:
TDBEdit(DBE).Text

ShortyHL 10. Mär 2008 18:54

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.

DeddyH 10. Mär 2008 19:28

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"?

ShortyHL 10. Mär 2008 19:45

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
So könnte man es auch machen, ich werd es mal umsetzen...

ShortyHL 11. Mär 2008 16:25

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).

DeddyH 11. Mär 2008 16:28

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Es scheint so, als ob Du auf ein Objekt zugreifst, das noch nicht instanziiert wurde.

ShortyHL 11. Mär 2008 16:44

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.

DeddyH 11. Mär 2008 16:48

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Zeig doch mal die Stelle, an der der Fehler auftritt.

ShortyHL 11. Mär 2008 16:57

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

DeddyH 11. Mär 2008 17:01

Re: Problem: DBEdit/Edit Felder per Knopfdruck generieren
 
Und wie sieht CreateFields aus?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.
Seite 1 von 2  1 2      

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