Entwickler-Ecke
Sonstiges (Delphi) - Variableninhalt geht plötzlich in Procedure verloren
MisterBum - Fr 05.08.05 15:25
Titel: Variableninhalt geht plötzlich in Procedure verloren
Hallo,
ich habe einen unerklärlichen Fehler. Mit dem unteren Code wird ein DBGrid durch anklicken der entsprechenden Spalte sortiert. Beim ersten Click klappt alles wunderbar, beim zweiten Mal ist der Wert in Column.FieldName noch OK in erster Zeile, geht aber dann plötzlich bei if Column.FieldName<>... verloren, das heisst es steht nix mehr drin und es kommen Zugriffsverletzungen
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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| procedure TFormMain.DBGrid1TitleClick(Column: TColumn); var Tabelle: string; i: integer; begin if Column.FieldName = '' then exit;
Datenbank.ADOQueryKASuchen.SQL.Clear;
if Column.FieldName <> sSortColumn then begin sSortColumn := Column.FieldName; end else begin bSortOrder := not bSortOrder; end;
if ComboBox2.ItemIndex = 0 then begin Tabelle := 'Kunden'; Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourceKunden; end; if ComboBox2.ItemIndex = 1 then begin Tabelle := 'Artikel'; Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourceArtikel; end; if ComboBox2.ItemIndex = 2 then begin Tabelle := 'PLZ'; Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourcePLZ; end; if ComboBox2.ItemIndex = 3 then begin Tabelle := 'BLZ'; Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourceBLZ; end;
Datenbank.ADOQueryKASuchen.Close;
if bSortOrder then begin Datenbank.ADOQueryKASuchen.SQL.Add('SELECT * FROM ' + Tabelle + ' ORDER BY ' + sSortColumn); end else begin Datenbank.ADOQueryKASuchen.SQL.Add('SELECT * FROM ' + Tabelle + ' ORDER BY ' + sSortColumn + ' DESC'); end;
Datenbank.ADOQueryKASuchen.Open; DBGrid1.DataSource := Datenbank.DataSourceKASuchen; SetGridColumnWidths(DBGrid1);
for i := 0 to DBGrid1.Columns.Count - 1 do DBGrid1.Columns.Items[i].Color := clwhite; end; |
Ich bitte um eure Hilfe!!!
Gruß und Dank
MisterBum
MisterBum - Fr 05.08.05 15:33
Wenn ich mir den Variableninhalt anzeigen lassen über die Ausdrücke im DebugModus, dann steht da: Auf Variable Column kann wegen Optimierung nicht zugegriffen werden
Was heist das???
AndyB - Fr 05.08.05 16:16
| Zitat: |
Delphi-Quelltext 1:
| Datenbank.ADOQueryKASuchen.SQL.Clear; | |
Damit wird automatisch die Query geschlossen/geleert wodurch das DBGrid aktualisiert wird und somit nichts mehr enthält.
MisterBum - Fr 05.08.05 16:33
In einer anderen Unit funzt es mit folgendem Code: Warum?
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:
| inherited; Datenbank.ADOQueryAuftraegeSuchen.SQL.Clear; if Column.FieldName <> sSortColumn then begin sSortColumn := Column.FieldName; end else begin bSortOrder := not bSortOrder; end; Datenbank.ADOQueryAuftraegeSuchen.Close; if bSortOrder then begin Datenbank.ADOQueryAuftraegeSuchen.SQL.Add('SELECT * FROM AUFTRAEGE ORDER BY ' + sSortColumn); end else begin Datenbank.ADOQueryAuftraegeSuchen.SQL.Add('SELECT * FROM AUFTRAEGE ORDER BY ' + sSortColumn + ' DESC'); end; DBGrid1.DataSource := Datenbank.DataSourceAuftraegeSuchen; DBNavigator1.DataSource := DBGrid1.DataSource; Datenbank.ADOQueryAuftraegeSuchen.Open; SetGridColumnWidths(DBGrid1);
for i := 0 to DBGrid1.Columns.Count - 1 do DBGrid1.Columns.Items[i].Color := clwhite; Column.Color := claqua; |
AndyB - Fr 05.08.05 17:10
Vielleicht ist das Grid ja mit einem anderen Query oder Table verbunden, oder vielleicht wird da irgendwo mittels PostMessage die Änderung weitergegeben.
Jedenfalls schließt das ADOQuery beim Ändern der SQL-Eigenschaft automatisch die Query.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TADOQuery.QueryChanged(Sender: TObject); begin if not (csLoading in ComponentState) then Close; ... end; |
Die einfachste Methode wäre sich den FieldName vor dem Ändern in eine lokale Variable zu retten.
MisterBum - Fr 05.08.05 19:50
Das hatte ich auch schon versucht.
z.B:
Delphi-Quelltext
1: 2: 3:
| var Merker: TColumn;
Merker:= Column; |
aber auch dabei wird Merker gelöscht!
Alles sehr merkwürdig! Wie bekäme ich die den in String als Datentyp???
LigH - Fr 05.08.05 19:58
Du solst dir ja auch nur den Namen merken, nicht den Verweis auf die gesamte Spalte!
Delphi-Quelltext
1: 2: 3:
| var Merker: String;
Merker := Column.Name; |
__
Oder noch 'ne ganz andere Idee:
Ist es ihnaltlich wirklich notwendig, die SQL-Query so früh schon zu leeren? Kann es nicht auch erst später passieren, kurz vor dem Close vielleicht?
AndyB - Fr 05.08.05 20:27
Also ich persönlich nutze immer SQL.Text statt SQL.Clear und dann SQL.Add. Das ist zum einen viel Handlicher und und zum anderen erschlägt es das Clear und Add auf einmal.
LigH - Fr 05.08.05 20:56
Das mag bei einfachen Anfragen auch effizienter sein.
Wenn ich mir aber eine Anfrage aus Einzelteilen zusammenbasteln muss (z.B. eine Such-Query, in der man nach mehreren Feldern nach Belieben suchen darf), also Teile der Anfrage nur unter bestimmten Bedingungen eingefügt werden, dann kann das "SQL.Add" sinnvoller sein. Gerade wenn man auch noch fein ordentlich mit :Parametern arbeitet.
Immer je nach Bedarf...
MisterBum - Mo 08.08.05 14:43
Danke, funzt jetzt!!!
Hier meine Lösung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var Merker: integer; Merker := Column.Index; for i := 0 to DBGrid1.Columns.Count - 1 do DBGrid1.Columns.Items[i].Color := clwhite; DBGrid1.Columns[Merker].Color := claqua; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!