Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TEdit mit DBEdit? (https://www.delphipraxis.net/33230-tedit-mit-dbedit.html)

Leon de Bar 3. Nov 2004 18:37


TEdit mit DBEdit?
 
Hi,

ich habe ein Panel, in dem ich gerne Text mit Variablen-Inhalt anzeigen möchte.

Also quasi als überschrift: Das sind daten von [DBEdit1], [DBEdit2] - [DBEdit3]

soll dann so aussehen: Das sind daten von de Bar, Leon - 1234567

Hansa 3. Nov 2004 18:44

Re: TEdit mit DBEdit?
 
Meinst du nicht eher DBText ?

Leon de Bar 3. Nov 2004 18:47

Re: TEdit mit DBEdit?
 
ja okay, dbtext... aber ich bekomme es nicht hin... :wall:

Hansa 3. Nov 2004 19:03

Re: TEdit mit DBEdit?
 
So mit Sicherheit nicht. Also gut, Ratespiel geht weiter :mrgreen: Wie siehts mit Datasource aus ?

Leon de Bar 3. Nov 2004 19:34

Re: TEdit mit DBEdit?
 
:oops: oh da habe ich dich wohl falsch verstanden...

okay, ausführlicher: :)

im Form1 stelle ich die verbindung zur DB her.
vom Form3 (um das geht es eigentlich) fülle ich verschieden DBEdits mittels Form1.DataSource1. Das mache ich über den OI.

Ich möchte nun meine 'Panel'-Überschrift wie oben beschrieben ergänzen. das geht nur im SourceCode direkt. Mir ist immer noch nicht klar wie ich die DataSource manuel eintrage... Ich denke das wird das erste problem sein...?

Tharon 3. Nov 2004 19:49

Re: TEdit mit DBEdit?
 
Hi!

Delphi-Quellcode:
panTitle.Caption := Format(' Das sind Daten von %s, %s - %s', [edtName.EditText, edtVorname.EditText, edtWasAuchImmerFuerNeNummer.EditText]);
Besser finde ich es allerdings, die Daten direkt aus der Datequelle zu nehmen, also nicht über den Umweg von Edits oder was auch immer (auch wenn diese sowieso auf dem Formular vorhanden sein sollten):

Delphi-Quellcode:
ds := Form1.DataSource1.DataSet; // dient nur als Abkürzung

panTitle.Caption := Format(' Das sind Daten von %s, %s - %s', [ds['Name'], ds['Vorname'], ds['Nr']]);
Noch besser mit Berücksichtigung von Null-Werten... auch wenn Du denkst, das kann nicht vorkommen ;-)

Delphi-Quellcode:
ds := Form1.DataSource1.DataSet; // dient nur als Abkürzung

panTitle.Caption := Format(' Das sind Daten von %s, %s - %s',
                           [LibVarCvNull(ds['Name'], '???'), LibVarCvNull(ds['Vorname'], '???'), LibVarCvNull(ds['Nr'], '???')]);


function LibVarCvNull(const a_vValue: Variant; const a_vReplace: Variant): Variant;
begin
  if (VarIsNull(a_vValue) or VarIsEmpty(a_vValue)) then
  begin
    Result := a_vReplace;
  end else
  begin
    Result := a_vValue;
  end;
end; // LibVarCvNull
Wenn jetzt z.B. im Feld Vorname nichts drinsteht, wird "Das sind Daten von de Bar, ??? - 1234567" angezeigt und nicht "Das sind Daten von de Bar, - 1234567". Anstatt Fragezeichen kannst du natürlich jeden beliebigen Ersatztext nehmen... der natürlich auch wieder aus der Datenbank kommen könnte...

Vergiss nicht das Leerzeichen am Anfang des Textes, sonst ist der Text nämlich ganz links an den Rand des Panels geklatscht (falls Alignment auf taLeftJustify steht).

Ich hoffe, dass war das, was Du wissen wolltest...

Leon de Bar 3. Nov 2004 22:17

Re: TEdit mit DBEdit?
 
:thumb: :bounce1: DAS war genau das was ich wollte :hello: :hello:


Dank dir.

Leon de Bar 3. Nov 2004 22:32

Re: TEdit mit DBEdit?
 
äh... was meinst du mit

// dient nur als Abkürzung?

wenn ich das so eintrage bekomme ich den hinweis, Inkompatible Typen Sring und TDataSet.


das ist ja mein problem, dass ich diese konektion nie hinbekomme...

Sharky 4. Nov 2004 09:40

Re: TEdit mit DBEdit?
 
Zitat:

Zitat von Leon de Bar
äh... was meinst du mit

// dient nur als Abkürzung?...

Ich denke er möchte einfach vermeiden immer Form1.DataSource1.DataSet im Code schreiben zu müssen.
Darum wählt er diesen Weg;

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ds : TDataSet; // lokales TDataSet
begin
  ds := TDataSet.Create(self);
  try
    ds := Form1.DataSource1.DataSet; // Das DataSet (TTable oder TQuery) zuweisen
    ds.Edit;
    ds.FieldByName ('blubb').AsString := 'Sharky';
    ds.Post;
    .
    .
  finally
    ds.Free;
  end;
end;

Leon de Bar 4. Nov 2004 16:45

Re: TEdit mit DBEdit?
 
@ Sharky:

Also wenn ich das eingebe...:

Delphi-Quellcode:
  ds := TDataSet.Create(Self);
  ds := Form1.DataSource1.DataSet;
  Panel1.Caption := Format(' Das sind Daten von %s, %s - %s', [ds['Name'], ds['Vorname'], ds['Mitgliedsnummer']]);
bekomme ich eine fehlermeldung: ADOQuery1: Das Feld 'Name' wurde nicht gefunden.

du hast ja meinen Code... :gruebel:

Sharky 4. Nov 2004 16:50

Re: TEdit mit DBEdit?
 
Zitat:

Zitat von Leon de Bar
...bekomme ich eine fehlermeldung: ADOQuery1: Das Feld 'Name' wurde nicht gefunden....

Gibt es denn in der Tabelle mit der dein ADOQuery1 "verbunden" ist auch das Feld 'Name'?

Leon de Bar 4. Nov 2004 16:53

Re: TEdit mit DBEdit?
 
Hast du meinen source-code heute früh nicht erhalten?

ja, die Query sieht so aus...:

Delphi-Quellcode:
  ADOQuery1.SQL.Text :=
    'SELECT Mitgliedsnummer, Vorname, Name, Strasse, Land, PLZ, Ort, ' +
      'Tel_1, Fax_1, Tel_2, Fax_2, Handy, email, ' +
      'GebDat, ' +
      'Saldo, ' +
      'Eintritt, ' +
      'Spielernummer, Trikot, Spielerposition.Spielerpos FROM ' +
      'ID, Mitglied, Kontakt, GebDatList, MG_Saldenliste, ' +
      'Mitgliedsstatus, Spielerdaten, Spielerposition ' +
      'WHERE Mitglied.ID=Kontakt.ID AND Kontakt.ID=GebDatList.ID AND ' +
      'GebDatList.ID=MG_Saldenliste.ID AND MG_Saldenliste.ID=Mitgliedsstatus.ID ' +
      'AND Mitgliedsstatus.ID=Spielerdaten.ID AND Spielerdaten.Spielerpos=' +
      'Spielerposition.SID';
Nachtrag:
...und das zeigt mir der Compiler an.

[Hinweis] Mitgliedsdaten.pas(103): Auf 'ds' zugewiesener Wert wird niemals benutzt

Scheint so als würde überhaupt nicht auf meinen Code zugegriffen zu werden. Verstehe ich das richtig?

Leon de Bar 5. Nov 2004 17:43

Re: TEdit mit DBEdit?
 
* push * :)

Leon de Bar 5. Nov 2004 22:24

Re: TEdit mit DBEdit?
 
kann geschlossen werden.

der fehler lag bei mir, da ich die ereignisse in OnCreate und nicht im OnShow eingetragen hatte. Nun läuft es...

Thx für die mithilfe.

Tharon 5. Nov 2004 23:05

Re: TEdit mit DBEdit?
 
Also... Sharky hat schon richtig erkannt, dass ich einfach nicht ständig Form1.DataSource1.DataSet im nachfolgenden Code wiederholen wollte! Allerdings ist wohl das Prinzip noch nicht ganz klar... Ausserdem steckt in seinem Codebeispiel ein gaaanz böser Fehler drin: Erst wird eine neue TDataSet-Instanz erzeugt (was hier völlig unnötig ist), dann wird der Objektvariablen ds eine ganz andere Instanz (nämlich Form1.DataSource1.DataSet) zugewiesen. Im finally-Abschnitt wird dann diese andere Instanz zerstört (also Form1.DataSource1.DataSet) und die neu erzeugte Instanz wird überhaupt nicht zerstört (es gibt ja auch keinen Pointer mehr auf diese neue Instanz)... uiuiuiuiuiuiu....

Die richtige Variante sieht so aus:

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  ds : TDataSet; // lokales TDataSet
begin

  ds := Form1.DataSource1.DataSet;
  Panel1.Caption := Format(' Das sind Daten von %s, %s - %s', [ds['Name'], ds['Vorname'], ds['Mitgliedsnummer']]);

  { ... }

end;
Du könntest es auch so schreiben, was aber länger und vor allem schlechter wartbar ist:

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin

  Panel1.Caption := Format(' Das sind Daten von %s, %s - %s',
                           [Form1.DataSource1.DataSet['Name'],
                            Form1.DataSource1.DataSet['Vorname'],
                            Form1.DataSource1.DataSet['Mitgliedsnummer']
                           ]);

  { ... }

end;
Die Anweisung
Delphi-Quellcode:
ds := TDataSet.Create(Self);
musst Du unbedingt aus Deinem Code entfernen! Denn Du erzeugst hier eine neue Instanz, die aber weder benötigt noch verwendet wird (deshalb auch der Compiler-Hinweis "Auf 'ds' zugewiesener Wert wird niemals benutzt") und - was wirklich schlimm ist - niemals freigegeben wird! D.h Du erzeugst bei jedem Aufruf Deines Formulars eine neue TDataSet-Instanz, die dann alle nutzlos ohne Referenz im Speicher rumliegen...

Wenn Du allerdings tatsächlich eine Objektinstanz erzeugen musst, ist der nachfolgende Zugriff auf diese neue Instanz unbedingt durch einen try-finally-Block zu kapseln (so wie es Sharky schon gezeigt hat):

Delphi-Quellcode:
var
  obj1:   TMyClass;
begin

  obj1 := TMyClass.Create();
  try
    // Irgendwas mit obj1 machen...
  finally
    obj1.Free;
  end;

end;


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