Autor Beitrag
Hänsel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 144



BeitragVerfasst: Mo 23.07.18 16:37 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Hänsel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 144



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Hänsel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 144



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 25.07.18 08:48 
user profile iconHänsel hat folgendes geschrieben Zum zitierten Posting springen:


Das Fenster wird geöffnet mit:
ausblenden 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:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 144



BeitragVerfasst: Mi 25.07.18 14:05 
Hallo

Danke für die guten Hinweise. Ich werde nochmal alles überarbeiten.

Danke Hänsel