Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#6

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