Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mi 15.01.14 05:49 
Moin Delpher,

Das Einlesen in ein Stringgrid mache ich so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure tform7.fsg(var tbx:TTable; Qx:TQuery);
var n : integer;
  gef : boolean;
begin
  gef := false;
  Tbx.First;
  Repeat
    if (Tbx.fieldbyname('Name').asstring = Qx.fieldbyname('NAME').asstring) and
       (Tbx.fieldbyname('VorName').asstring = Qx.fieldbyname('VorNAME').asstring) and
       (Tbx.fieldbyname('Klasse').asstring = Qx.fieldbyname('Klasse').asstring) then gef := true
    else Tbx.Next;
  until gef or Tbx.eof;
  if gef then
  begin
    stringgrid1.ColCount := Tbx.FieldCount;
    with stringgrid1 do
    begin
      for n := 0 to Tbx.fieldcount-1 do
      begin
        cells[n,0] := Tbx.fields[n].FieldName;
        cells[n,1] := Tbx.Fields[n].asstring;
      end;
    end;
    BuchMain.gridbreite(Stringgrid1, form7.Width, buchDM_Dlg.fontdialog1.Font.size);
  end
  else showmessage('Datensatz nicht gefunden');
end;


Das Abspeichern zurzeit so, weil ein Dazenfeld vom Typ "Date" ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if gef then
          begin
            BuchMain.TbSchueler.edit;
              for n := 0 to 4 do
                BuchMain.TbSchueler.fields[n].asstring := stringgrid1.cells[n,1];
              BuchMain.TbSchueler.fieldbyname('GEBDAT').AsDateTime := strtodate(stringgrid1.cells[5,1]);   // 5!!!
              for n := 6 to stringgrid1.ColCount-1 do
                BuchMain.TbSchueler.fields[n].asstring := stringgrid1.cells[n,1];
            BuchMain.TbSchueler.post;
            filesetdate(BuchMain.Label30.Caption+extractfilename(BuchMain.TbSchueler.tablename), datetimetofiledate(now));
            showmessage('Person aus ' + BuchMain.TbSchueler.tablename + #13 +
                        'wurde geändert:  ' + datetimetostr(now));


geht das nicht eleganter?

Mir schwant so etwas wie .asvalue.

Vielen Dank für eine Idee.

LG, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 15.01.14 07:44 
Frage:
Warum ein stringgrid? Wenn Du eh eine Datenbank nutzt, dann geht das doch mit DBGrid genauso, wenn nicht besser, oder? Du kannst ja dann (bei TQuery als Datensatzkomponente) in der SQL Deine Vergleichswerte als Auswahlkriterien nehmen. (Gegebenenfalls als Parameter)

Dann benötigst Du keine Einleseprozedur mehr. Und wenn Du die Werte speichern willst, kannst Du das ja dann in einer neuen Tabelle ebenfalls tun. Gleichzeitig kannst Du die aktuellen Auswahldaten ja auch editieren.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.

Für diesen Beitrag haben gedankt: D. Annies
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 15.01.14 08:55 
Ja, so ein TDBGrid wäre vermutlich erheblich einfacher.

Zur Frage:
Was du meinst ist "AsVariant". Getestet habe ich das aber nicht.

Deine erste Prozedur ist aber nicht sicher. Was passiert, wenn tbx oder qx leer ist? Dann wirst du in der Repeat-Schleife eine Exception bekommen.
Also entweder eine While-Schleife oder vorher prüfen, ob die DataSets nicht leer sind, bevor es in die Schleife geht.

Für diesen Beitrag haben gedankt: D. Annies
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 15.01.14 09:07 
IIRC nicht AsVariant, sondern Value. Wobei ich mich auch frage, wozu das StringGrid. Und mir ist noch etwas anderes aufgefallen:
Zitat:
ausblenden Delphi-Quelltext
1:
BuchMain.gridbreite(Stringgrid1, form7.Width, buchDM_Dlg.fontdialog1.Font.size);					

Hier wird auf die benannte Instanz zugegriffen statt auf die eigene. Das kann gutgehen, muss aber nicht. Besser wäre es, das "form7." ganz wegzulassen oder durch "Self." zu ersetzen, dann wird auch garantiert immer die eigene Instanz angesprochen.

Für diesen Beitrag haben gedankt: D. Annies
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 15.01.14 09:36 
Zitat:
property Value: Variant read GetAsVariant write SetAsVariant;

Zitat:
property AsVariant: Variant read GetAsVariant write SetAsVariant;

Da scheinen wir wohl beide Recht zu haben. :wink:

AsVariant ist für mich aber klarer, da ich bei Value gedanklich von numerischen Werten ausgehe. Aber das ist natürlich Geschmackssache.

Interessanterweise ist die Beschreibung der beiden Properties in der Delphi-Hilfe aber unterschiedlich. Kann sich dann aber jeder selbst durchlesen.

Für diesen Beitrag haben gedankt: D. Annies
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 15.01.14 09:54 
Stimmt, ich habe auch mal nachgesehen. Da beide Properties exakt dieselben Getter und Setter verwenden, muss es ja auch exakt dasselbe sein, nur eben unter unterschiedlichen Bezeichnern ;)

Für diesen Beitrag haben gedankt: D. Annies
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 15.01.14 10:25 
Das mit dem AsValue und AsVariant ist ja eigentlich logisch. Denn Variant ist ja - wie der Name schon sagt - ein variabler Typ, der zuweisungskompatibel zu allen anderen Typen sein muss. Es besteht nur ein Problem, wenn die beiden Tabellen unterschiedliche Typendeklarationen der Felder haben. z.B. QX beim Datenfeld String und TX DateTime. Dann könnte es sein, dass Exceptions bei der Zuweisung auftreten. Hier wäre dann sinnvollerweise ein Try .. except .. end-Konstrukt einzusetzen.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.

Für diesen Beitrag haben gedankt: D. Annies
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: So 19.01.14 04:39 
vielen Dank, Detlef

_________________
ut vires desint, tamen est laudanda voluntas