AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi hängt bei klick auf Frame

Ein Thema von MorrisF · begonnen am 11. Apr 2019 · letzter Beitrag vom 12. Apr 2019
Antwort Antwort
Seite 1 von 2  1 2      
Delphi.Narium

Registriert seit: 27. Nov 2017
2.562 Beiträge
 
Delphi 7 Professional
 
#1

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 12:36
Nur im Editor hingedattelt, daher keine Garantie für irgendwas
Delphi-Quellcode:
function TDialog_Hauptprogramm.CreateFrames(): Boolean;
var
  j: Integer;
  myFrame : TMein_Frame;

  function DeleteFrames(): Boolean;
  var
    i: Integer;
  begin
    try
      for i := Low(Frame) to High(Frame) do
      begin
        if Assigned(Frame[i]) then
          FreeAndNil(Frame[i]);
      end;
      SetLength(Frame, 0);
      Result := True;
    except
      on e: Exception do
      begin
        Result := False;
        ShowMessage(Format('Fehler in DeleteFrames(): %s',e.Message]));
      end;
    end;
  end;

begin
  try
    // Erst alle Frames löschen
    Result := DeleteFrames();
    if Result then
    begin
      TmpQuery.Close;
      TmpQuery.SQL.Clear;
      TmpQuery.SQL.Add('SELECT * FROM meine_tabelle');
      TmpQuery.SQL.Add('WHERE ID_meine_tablle2 = ' + IntToStr(SpinEdit.Value));
      TmpQuery.Open;
      try
        TmpQuery.First;
        while not TmpQuery.Eof do
        begin
          SetLength(Frame, length(Frame) + 1);
          // Frame bauen:
          myFrame := TMein_Frame.Create(self);
          if Assigned(myFrame) then
          begin
            myFrame.Tag := tmpQuery.RecNo;
            myFrame.Name := Format('Mein_Frame_%d',[myFrame.Tag]);
            myFrame.Parent := PnlFramesBack;
            myFrame.Align := alLeft;
            // Frame ausstatten:
            myFrame.IsSelected := False;
            myFrame.PnlBack.BevelOuter := bvNone;
            myFrame.PnlBack.BevelWidth := 1;
            // allen Frame-Komponenten den selben tag vergeben und anklickbar machen:
            for j := 0 to myFrame.ComponentCount - 1 do
            begin
              myFrame.Components[j].Tag := myFrame.Tag;
              // Sicher, das alles nur TButtons oder deren Nachfahren sind?
              TButton(myFrame).Components[j]).OnClick := OnFrameClick;
              TButton(myFrame).Components[j]).Cursor := crHandPoint;
            end;
            myFrame.Show;
            Frame[High(Frame)] := myFrame;
          end;
          TmpQuery.Next;
        end;
      finally
        TmpQuery.Close;
      end;
      ScrollBoxFrames.Refresh;
    end;
  except
    on e: Exception do
    begin
      ShowMessage('Fehler in CreateFrames(): ' + e.Message);
      Result := False;
    end;
  end;
end;
Hier wurde für Frames TMein_Frame genutzt.
Im Folgenden wird für Frames TFrame_ButtonTest.

Sind die kompatibel oder ist das nur eine "BeispielquelltextZurProblemBeschreibungsdifferenz "?
Delphi-Quellcode:
procedure TDialog_MainUnit.FrameClick(Sender: TObject);
var
  tmpIdx, i: Integer;
begin
  if not Assigned(Sender) then begin
    MessageDlg('Vernünftige Fehlermeldung machen.',mtError,[mbOk),0);
  end else
  if not Sender is TComponent then begin
    MessageDlg('Noch ''ne vernünftige Fehlermeldung machen.',mtError,[mbOk),0);
  end else begin
    try
      tmpIdx := TComponent(Sender).Tag;
  
      LblFramesAktiv.Caption := 'Aktiver Frame: ';
      for i := Low(Frame) to High(Frame) do
      begin
        TFrame_ButtonTest(Frame[i]).IsSelected := False;
        TFrame_ButtonTest(Frame[i]).PnlTop.BevelOuter := bvNone;
        TFrame_ButtonTest(Frame[i]).PnlTop.BevelWidth := 1;
      end;
      TFrame_ButtonTest(Frame[tmpIdx]).IsSelected := True;
      TFrame_ButtonTest(Frame[tmpIdx]).PnlTop.BevelOuter := bvRaised;
      TFrame_ButtonTest(Frame[tmpIdx]).PnlTop.BevelWidth := 3;

      LblFramesAktiv.Caption := Format('Aktiver Frame: %s', [TFrame_ButtonTest(Frame[tmpIdx]).Name]);
    except
      on e: Exception do
      begin
        ShowMessage(Format('Fehler in FrameClick(): %s', [e.Message]));
      end;
    end;
  end;
end;
Wieso brauchst Du den Frame als globale Variabel? Du hast doch zur Laufzeit n Frames?

Geändert von Delphi.Narium (11. Apr 2019 um 12:52 Uhr) Grund: von Jumpy entdeckten Fehler behoben
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 12:45
Das DeleteFrames macht ja nur Sinn, wenn man das mehrfach neu aufbaut.
In dem Fall müsste man in DeleteFrames aber auch das Array wieder auf 0 setzen.

Und seh gerade, das hier macht in DeleteFrames doch auch keinen Sinn:
Delphi-Quellcode:
if Assigned(Frame) then
   FreeAndNil(Frame[i]);
Müsste doch eher sein:
Delphi-Quellcode:
if Assigned(Frame[i]) then
   FreeAndNil(Frame[i]);
Ralph

Geändert von Jumpy (11. Apr 2019 um 12:48 Uhr)
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#3

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 12:55
Das DeleteFrames macht ja nur Sinn, wenn man das mehrfach neu aufbaut.
In dem Fall müsste man in DeleteFrames aber auch das Array wieder auf 0 setzen.

Und seh gerade, das hier macht in DeleteFrames doch auch keinen Sinn:
Delphi-Quellcode:
if Assigned(Frame) then
   FreeAndNil(Frame[i]);
Müsste doch eher sein:
Delphi-Quellcode:
if Assigned(Frame[i]) then
   FreeAndNil(Frame[i]);
In meinem Hauptprogramm baue ich die Frames mehrfach auf. Daher das DeleteFrames.
Mit der Code Verbesserung hast du schon mal recht! Vielen Dank! Leider funktioniert das Programm immer noch nicht
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 12:59
Setzt du denn jetzt die Array-Länge wieder zurück?
Ralph
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#5

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 13:05
Setzt du denn jetzt die Array-Länge wieder zurück?
einfach auf 0 setzen?
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#6

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 13:16
1000 Dank!!! Das mit dem Array zurücksetzen hat funktioniert. Bekomme keinen Fehler wegen Zugriffsverletzung mehr.
Lieder hängt sich Delphi immernoch auf, wenn ich einen Haltepunkt in die OnFrameClick Prozedur setze.
Woran könnte das liegen?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.444 Beiträge
 
Delphi 12 Athens
 
#7

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 12:51
Hallöle...
Delphi-Quellcode:
TmpQuery.Close;
TmpQuery.SQL.Clear;
TmpQuery.SQL.Add('SELECT * FROM meine_tabelle');
TmpQuery.SQL.Add('WHERE ID_meine_tablle2 = ' + IntToStr(SpinEdit.Value));
TmpQuery.Open;
...früher gabs dafür einen mit dem Rohrstock!

besser:
Delphi-Quellcode:
TmpQuery.SQL.Text := 'SELECT * FROM meine_tabelle';
TmpQuery.SQL.Add('WHERE ID_meine_tablle2 = :ID');
TmpQuery.ParamByName('ID').AsInteger := IntToStr(SpinEdit.Value);
TmpQuery.Open;
  Mit Zitat antworten Zitat
Benutzerbild von FaTaLGuiLLoTiNe
FaTaLGuiLLoTiNe

Registriert seit: 3. Jul 2004
Ort: NRW
55 Beiträge
 
Delphi XE Enterprise
 
#8

AW: Delphi hängt bei klick auf Frame

  Alt 11. Apr 2019, 23:27
Mal so nebenbei:

Delphi-Quellcode:
if Assigned(Frame[i]) then
 FreeAndNil(Frame[i]);
Bei Aufrufen von TObject.Free und auch FreeAndNil ist die vorherige Prüfung auf Assigned überflüssig. Die Methoden prüfen selbst vor dem Aufruf des Destruktors auf <> nil.
Christian
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#9

AW: Delphi hängt bei klick auf Frame

  Alt 12. Apr 2019, 06:57
Bei Aufrufen von TObject.Free und auch FreeAndNil ist die vorherige Prüfung auf Assigned überflüssig. Die Methoden prüfen selbst vor dem Aufruf des Destruktors auf <> nil.
Danke für den Tip!
Aber das wird ja wohl nicht der Grund sein, warum sich Delphi beim klick auf den Frame aufhängt. Oder?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.444 Beiträge
 
Delphi 12 Athens
 
#10

AW: Delphi hängt bei klick auf Frame

  Alt 12. Apr 2019, 07:19
Moin...
Zitat:
Bei Aufrufen von TObject.Free und auch FreeAndNil ist die vorherige Prüfung auf Assigned überflüssig.
...ist schon richtig. Aber wenn du ein Object mit Free wegschmeißt, dann ist das Object nicht nil. Sondern ein "dangling pointer". https://de.wikipedia.org/wiki/H%C3%A4ngender_Zeiger
...dann hast du wieder das gleiche Problem mit der Zugriffsverletzung beim Free.

Am Rande:
Persönlich habe ich mit Arrays keinen Vertrag. Man muß sich immer um die Größe kümmern. Ich stehe mehr auf Listen. Die verwalten sich selbst. Tlist<> oder TObjectList<>

Geändert von haentschman (12. Apr 2019 um 07:22 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz