Entwickler-Ecke
Datenbanken - DBGrid Scroll-Leiste
Hänsel - Mo 23.07.18 16:37
Titel: DBGrid Scroll-Leiste
Hallo,
wer kann hier weiter helfen? Ich verwende Delphi 10. Im Startfenster befindet sich eine DBGrid mit entsprechenden Daten. Wenn ich von daraus ein anderes Fenster öffne (geöffnet wird dieses mit "Form_Objekt.ShowModal;")und dieses Fenster später wieder schließe, fehlt beim DBGrid die Scroll-Leiste auf der rechten Seite.Was habe ich da falsch gemacht bzw. was kann man da machen?
Danke schon im Voraus
Hänsel
Sinspin - Mo 23.07.18 17:15
Hey,
wie öffnest Du das andere Fenster? Als Reaktion auf einen Click im Grid?
Versuch es mal anders. Sende in dem Ereignishandler via PostMessage eine Nachricht die Du dann verarbeitest und darin das andere Fenster anzeigst.
Des weiteren kann es auch sein dass Du irgendwo ein Refresh für das Dataset des Grid hast und dann einfach weniger Daten im Grid sind, so dass die Scrollleiste nicht mehr nötig ist.
Hänsel - Mo 23.07.18 18:11
geöffnet wird das zweite bzw. alle anderen Fenster mit Form_Objekt.ShowModal . Beim zurück gehen sind alle Datensätze noch vorhanden. Man kann auch mit den Datensätzen die Tabelle noch bewegen. Aber der seitliche Scroll-Balken ist eben weg.
Gruß Hänsel
Sinspin - Mo 23.07.18 21:15
Hey,
Du kannst ruhig zweimal das gleiche schreiben. Nur hilft das kein bisschen, besser zu verstehen wann Du den modalen Dialog öffnest.
Allerdings sollte die Anzeige eines weiteren Fensters, in welcher Art auch immer, nicht dazu führen das ein Scrollbalken verschwindet.
Wie gibst Du das Fenster nach dem Anzeigen wieder frei? Ein Stück Quelltext wäre, denke ich, eine große Hilfe.
Hänsel - Mi 25.07.18 08:09
Hallo
sorry das ich das vergessen habe.
Das Fenster wird geöffnet mit:
procedure TForm1.DBCtrlGrid1DblClick(Sender: TObject);
var such,nr,we_nr :String;
begin
such:=DataModule1.ADOQuery_Objekte['ID'];
DataModule1.ADOQuery_Objekte.Close;
DataModule1.ADOQuery_Objekte.SQL.Text:='Select * From ODV2 Where ID ='+such+'';
DataModule1.ADOQuery_Objekte.Open;
DataModule1.ADOQuery_Wasser.Close;
DataModule1.ADOQuery_Wasser.SQL.Text:='Select * From Wasser Where ID ='+such+' order by SPA';
DataModule1.ADOQuery_Wasser.Open;
Form_Objekt.ShowModal;
und wenn das Fenster Objekt geschlossen wird:
procedure TForm_Objekt.SpeedButton39Click(Sender: TObject);
begin
DataModule1.ADOQuery_Objekte.Edit;
DataModule1.ADOQuery_Objekte.Post;
DataModule1.ADOQuery_Objekte.Close;
DataModule1.ADOQuery_Objekte.SQL.Text:='Select * From ODV2 order by obj';
DataModule1.ADOQuery_Objekte.Open;
Form1.Edit1.SetFocus;
close;
end;
Sicher habe ich hier beim schließe etwas vergessen, aber was?
Hänsel
jasocul - Mi 25.07.18 08:48
Hänsel hat folgendes geschrieben : |
Das Fenster wird geöffnet mit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.DBCtrlGrid1DblClick(Sender: TObject); var such,nr,we_nr :String; begin such:=DataModule1.ADOQuery_Objekte['ID']; DataModule1.ADOQuery_Objekte.Close; DataModule1.ADOQuery_Objekte.SQL.Text:='Select * From ODV2 Where ID ='+such+''; DataModule1.ADOQuery_Objekte.Open; DataModule1.ADOQuery_Wasser.Close; DataModule1.ADOQuery_Wasser.SQL.Text:='Select * From Wasser Where ID ='+such+' order by SPA'; DataModule1.ADOQuery_Wasser.Open; Form_Objekt.ShowModal; |
und wenn das Fenster Objekt geschlossen wird:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm_Objekt.SpeedButton39Click(Sender: TObject); begin DataModule1.ADOQuery_Objekte.Edit; DataModule1.ADOQuery_Objekte.Post; DataModule1.ADOQuery_Objekte.Close; DataModule1.ADOQuery_Objekte.SQL.Text:='Select * From ODV2 order by obj'; DataModule1.ADOQuery_Objekte.Open; Form1.Edit1.SetFocus; close; end; |
|
Ich vermute mal, dass du in den Fenstern die Datenanzeige über die selbe TDataSource mit ADOQuery_Objekte realisiert hast.
Falls du nicht irgendwo noch was sehr spezielles machst, vermute ich, dass die Doppelnutzung dieser Query zur Anzeige in einem Fenster und zur Bearbeitung im anderen Fenster und der ständigen Neuzuweisung der SQL-Statements irgendwas "kaputt" macht.
Es ist natürlich auch die Frage, was du in der ersten Form anzeigst. Das Ergebnis von ADOQuery_Objekte oder ADOQuery_Wasser? Die zweite Abfrage wird beim Close ja nicht zurückgesetzt.
Das folgende bitte nur als gut gemeinten Rat verstehen:
Du hast zirkuläre Referenzen. Das heißt, du hast in der Unit für die Objekte ein Uses mit der Unit der Form1 und umgekehrt. Das ist in der Regel problemlos, aber eben nur in der Regel. In diesem Fall auch nicht erforderlich, da du Edit1.SetFocus auch in Form1 nach dem Form_Objekt.ShowModal machen kannst.
Bitte deine Button, Edits, Forms, DataModule, ... mit sinnvollen Namen versehen. Ein SpeedButton39 wird dich irgendwann vor Probleme stellen, wenn du den Source in 3 Monaten wieder ansiehst. Beispiel btnClose für SpeedButton39.
Parameter für die SQL-Statements verwenden.
Im Moment vermutlich noch kein Problem, aber es erhöht die Lesbarkeit des Sources, schützt vor Code-Injection und beschleunigt die SQL-Abfragen (Stichwort Prepare).
Den Sinn hiervon habe ich gar nicht verstanden:
Delphi-Quelltext
1: 2:
| DataModule1.ADOQuery_Objekte.Edit; DataModule1.ADOQuery_Objekte.Post; |
Wenn du schon im Edit-Modus bist, sollte das eine Exception auslösen. Bist du nicht im Edit-Modus, sind diese Anweisungen sinnlos.
Hänsel - Mi 25.07.18 14:05
Hallo
Danke für die guten Hinweise. Ich werde nochmal alles überarbeiten.
Danke Hänsel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 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!