AGB  ·  Datenschutz  ·  Impressum  







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

Buttons in Stringgrid

Ein Thema von IMPEGA · begonnen am 25. Jul 2011 · letzter Beitrag vom 25. Jul 2011
Antwort Antwort
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
91 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Buttons in Stringgrid

  Alt 25. Jul 2011, 19:38
Prinzipiell verstehe ich was du damit meinst
Zitat:
PS: Die Buttons haben ein .Tag, wo man sich eine Nummer drin speichern kann,
oder man vergleicht die Instanz des geklickten Buttons (Sender im OnClick) mit den Instanzen im Array.
Wobei man die Buttons auch direkt an das Daten-Property der jeweiligen Row hängen könnte.
Leider kriege ich es nicht umgesetzt.
Was das I global angeht, klar reicht es das I local zu deklarieren.
Das entstand weil ich aus Verzweiflung alles mögliche probiert habe.
Dazu gehört globale Deklaration von I und paar andere Parameter, die ich aber aufgegeben habe.
Könntest du mir deine Erklärung etwas genauer erklären ?
Am liebsten mit einem kleinen Beispiel. Muss nicht auf meine Vorlage bezogen werden , Hauptsache ich schnalle wie es geht.
Wie gesagt, ich bin noch ein Anfänger.
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
200 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Buttons in Stringgrid

  Alt 25. Jul 2011, 20:11
hilft da nicht StringGrid1.onFixedCellClick ? Da sind bereits Schalter, da brauchst du nur drauf Antworten.

procedure FixedCellClick(Sender: TObject; ACol, ARow: Integer);

Es wird dir Zeile und Spalte übergeben
Peter Niemeier
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
200 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Buttons in Stringgrid

  Alt 25. Jul 2011, 20:22
Wenn du nach wie vor auf eigene Schalter bestehst, dann hilft dir vielleicht folgender Code weiter:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    ComboBox1: TComboBox;
    Label1: TLabel;
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure ComboBox1Change(Sender: TObject);
    procedure StringGrid1TopLeftChanged(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure setRect(rec: TRect); // per Hand eintragen!
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

// Beim Laden des Formulars werden die notwendigen Initialisierungen des StringGrid durchgeführt:
procedure TForm1.FormCreate(Sender: TObject);
begin
 with StringGrid1 do
  begin
   // Spalten:
   ColCount := 8;
   ColWidths[0] := 80; // erste Spalte 80 Pixel breit
   Cells[0,0] := 'Zeitraum';
   Cells[1,0] := 'Sonntag';
   Cells[2,0] := 'Montag';
   Cells[3,0] := 'Dienstag';
   Cells[4,0] := 'Mittwoch';
   Cells[5,0] := 'Donnerstag';
   Cells[6,0] := 'Freitag';
   Cells[7,0] := 'Sonnabend';
   // Zeilen:
   RowCount := 4;
   Cells[0,1] := ' 6:00 - 14:00';
   Cells[0,2] := '14:00 - 22:00';
   Cells[0,3] := '22:00 - 6:00';
   DefaultRowHeight := Combobox1.Height;

   Options := Options + [goTabs];
  end

 end;

// Positionierung der Combobox (muss als Methode von Form1 deklariert werden):
procedure TForm1.setRect(rec: TRect);
var r: TRect;
begin
  with ComboBox1 do
  begin
        CopyRect(r, rec); // rec => r (Eck-Koordinaten an Hilfsrechteck übergeben)
        // Umrechnung der Eck-Koordinaten des Hilfsrechtecks:
        r.BottomRight := Parent.ScreenToClient(StringGrid1.ClientToScreen(r.BottomRight));
        r.TopLeft := Parent.ScreenToClient(StringGrid1.ClientToScreen(r.TopLeft));
        // Positionierung der Combobox (Left, Top, Width und Height werden zugewiesen):
        SetBounds(r.Left, r.Top, r.Right-r.Left, r.Bottom-r.Top);
        BringToFront // Combobox in Vordergrund bringen
   end
end;

// Im OnDrawCell-Event wird Combobox exakt über die Zelle positioniert:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   if (ACol >= StringGrid1.FixedCols) and (ARow >= StringGrid1.FixedRows) and
      (gdFocused in State) then setRect(Rect);
end;

// Comboboxinhalt wird in Zelle übertragen:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
   Beep;
   with StringGrid1 do Cells[Col, Row] := ComboBox1.Text
end;

//Der folgende Eventhandler versteckt die Combobox, wenn sie aus dem StringGrid "herausgescrollt" wird:
procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
 with StringGrid1 do setRect(CellRect(Col,Row));
end;


end.
das habe ich aus dem sogenannten Kochbuch von Doberenz und Kowalski.

Klappt aber, ich habe es mit eine TColorBox programmiert, sollte auch mit TButton funktionieren
Peter Niemeier
  Mit Zitat antworten Zitat
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
91 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Buttons in Stringgrid

  Alt 25. Jul 2011, 20:26
Danke an Alle

@himitsu dein Ansatz hat mich auf die Lösung verwiesen.
Hier das Relevante
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  I : Integer;
begin
  for I := 1 to StringGrid1.RowCount -1 do
  begin
     Btn[I] := TSpeedButton.create(self);
     Btn[I].Caption := 'Löschen';
     Btn[I].Name := 'Löschen' + inttostr(i);
     Btn[I].parent := Stringgrid1;
     Btn[I].visible := false;
     Btn[I].Tag := 100 + I;
     Btn[I].OnClick := MyClick;
     FreeOnRelease;
  end;

procedure TForm1.MyClick(Sender: TObject) ;
var
  I:Integer;
begin
  for I := 1 to StringGrid1.RowCount do
    begin
      if Sender = FindComponent('Löschen' + IntToStr(I)) then
        begin
          showmessage('Lösche Zeile '  + IntToStr(I) );
        end;
    end;
end;
Es funktioniert einwandfrei.


@Peter-Pascal
Ich bin auf dein Tip nicht eingegangen weil ich schon sehr tief an meiner Lösung gegraben habe.
Danke trotzdem.
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:25 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