Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 15.01.14 05:49
Moin Delpher,
Das Einlesen in ein Stringgrid mache ich so:
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:
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]); 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
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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: | 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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.
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
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 19.01.14 04:39
vielen Dank, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|