Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StringGrid: eine Zeile markieren? (https://www.delphipraxis.net/60082-stringgrid-eine-zeile-markieren.html)

Helmi 2. Jan 2006 20:05


StringGrid: eine Zeile markieren?
 
Hallo,

wie kann ich eine Zeile eines StringGrids markieren?

[edit]

Ich vergaß: die zeile soll nur durch eine Procedure (z. B. Aufruf durch ein MainMenu-Item) markiert werden.
Durch einen Klick auf eine Zelle soll diese markiert sein.

gesetzte Optionen:
  • goEditing
  • die Standard-gesetzen Optionen

[/edit]

Lannes 2. Jan 2006 20:33

Re: StringGrid: eine Zeile markieren?
 
Hallo,

was soll markiert werden?
Die Zeile mit der aktuell markierten Zelle:
Delphi-Quellcode:
StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
                                        StringGrid1.Row,
                                        StringGrid1.ColCount-1,
                                        StringGrid1.Row));
Eine bestimmte Zeile (z.B. die 3te Zeile):
Delphi-Quellcode:
StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
                                        2,
                                        StringGrid1.ColCount-1,
                                        2));

Helmi 2. Jan 2006 21:07

Re: StringGrid: eine Zeile markieren?
 
Zitat:

Zitat von Lannes
Hallo,

was soll markiert werden?
Die Zeile mit der aktuell markierten Zelle:
Delphi-Quellcode:
StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
                                        StringGrid1.Row,
                                        StringGrid1.ColCount-1,
                                        StringGrid1.Row));
Eine bestimmte Zeile (z.B. die 3te Zeile):
Delphi-Quellcode:
StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,
                                        2,
                                        StringGrid1.ColCount-1,
                                        2));

Ich will die Zeile der aktuell markierten Zelle makieren.
Wenn ich deinen Code benutze, dann markiert er mir nur die schon markierte Zelle und die letzte Zeile.

Lannes 2. Jan 2006 21:19

Re: StringGrid: eine Zeile markieren?
 
Hallo,

gerade nochmal getestet,
es funktioniert einwandfrei :?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.Selection := TGridRect(Rect(StringGrid1.FixedCols,  //Left:  Fixedcols nicht markiern
                                          StringGrid1.Row,        //Top:   aktuelle Zeile
                                          StringGrid1.ColCount-1, //Right: bis zur letzten Zelle
                                          StringGrid1.Row));      //Bottom: aktuelle Zeile
end;
//Edit: sehe gerade bei Aufruf aus einem Menü gibt es Probleme

Hansa 2. Jan 2006 21:29

Re: StringGrid: eine Zeile markieren?
 
Wahrscheinlich meint er sowas :

Delphi-Quellcode:
procedure Tfrmsg.sgClick(Sender: TObject);
begin
  inherited;
  sg.Selection := TGridRect(Rect(sg.FixedCols,
                                 sg.Row,
                                 sg.ColCount-1,
                                 sg.Row));
end;
Klicke ich auf eine Zelle, so wird rechts und links davon alles blau und die ausgewählte sowie die letzte Zelle in der Zeile aber nicht.

Edit : wird am Grid nichts gemacht und das ganze wird von außerhalb z.B. einen ButtonClick ausgelöst, dann ists richtig !

Helmi 2. Jan 2006 21:37

Re: StringGrid: eine Zeile markieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich euren Code aus einem Button raus starte dann wird nichts markiert.

Wenn ich aber in das OnClick-Ereignis der StringGrid schreibe, dann passiert das was auf dem Bild zu sehen ist.

[Edit] Ich muss noch hinzu sagen, dass ich OnDrawCell verwende. Wenn ich im OnDrawCell mal ein exit am Anfang schreibe (damit mein Code nicht durchlaufen wird) wird auch die ganze Zeile markiert (von einem Button aus) [/Edit]

Lannes 2. Jan 2006 22:00

Re: StringGrid: eine Zeile markieren?
 
Hallo,

OnDrawCell :roll:
was machst Du darin?

Mit dem Code funktioniert es aus den verschiedenen Aufrufmöglichkeiten.
Wobei nur beim Buttonklick alle Zellen markiert(blau) werden,
bei Aufruf aus Menü oder im onClick des StringGrids
ist die erste Zelle der Zeile nur mit einem Focusrahmen versehen.
Delphi-Quellcode:
var aRow,aFixCols : Integer;
begin
  aRow := StringGrid1.Row;
  aFixCols := StringGrid1.FixedCols;
  //erste Zelle markieren
  StringGrid1.Selection := TGridRect(Rect(aRow,aFixCols,aRow,aFixCols));
  StringGrid1.SetFocus;
  //jetzt sozusagen eine Selectierung von hinten nach vorne
  StringGrid1.Selection := TGridRect(Rect(StringGrid1.ColCount-1,
                                          aRow,
                                          aFixCols,
                                          aRow));
Was besseres fällt mir jetzt nicht ein :gruebel:

Helmi 2. Jan 2006 22:07

Re: StringGrid: eine Zeile markieren?
 
Im OnDrawCell mach ich folgendes:

Delphi-Quellcode:
procedure TMainForm.StringGrid_AblaufDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid), Canvas do
    begin
      //linke, obere Zelle
      if (ACol = 0) and (ARow = 0) then
        begin
          Brush.Color := clWhite;
        end;

      //erste Zeile und erste Spalte neu zeichnen
      if (ACol = 0) or (ARow = 0) then
        begin
          //Textfarbe Blau
          Font.Color   := clBlue;
          Font.Height  := 16;
          Font.Style   := [fsBold];
          TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
          FrameRect(Rect);
        end
      else
        begin
          //Hintergrundfarbe Weiss
          Brush.Color := clwhite;

          //Textfarbe Schwarz
          Font.Color   := clBlack;
          Font.Height  := 12;
          Font.Style   := [fsBold];
          TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
          FrameRect(Rect);
        end;

      //
      If (ARow > 0) and (ACol > 1) and (ACol < 11) then
        If Cells[ACol, ARow] <> '' then
          begin
            case Cells[ACol, ARow][1] of
              '1': begin
                      //Hintergrund-Farbe "rot" bei Relais einschalten
                      Canvas.Brush.Color := clRed;
                    end;
              '0': begin
                      //Hintergrund-Farbe "rot" bei Relais einschalten
                      Canvas.Brush.Color := clLime;
                    end;
              '?': begin
                      //Hintergrund-Farbe "rot" bei Relais einschalten
                      Canvas.Brush.Color := clYellow;
                    end;
            else
              //Hintergrund-Farbe "weiss"
              Canvas.Brush.Color := clWhite;
            end;

            TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
            FrameRect(Rect);
          end;
    end;
end;

Lannes 2. Jan 2006 22:21

Re: StringGrid: eine Zeile markieren?
 
Hallo,

in Deiner OnDrawCell-Behandlungs-Routine werden selectierte Zellen wie normale gezeichnet.
Füge mal die markierte Zeile in die Prozedur ein,
dann klappt erst mal die Selectierung.
Delphi-Quellcode:
//...
begin
  with (Sender as TStringGrid), Canvas do
    if not (gdSelected in State) then//<----------- !!!
    begin
    //...
Dann die Procedur zu OnDrawCell erweitern
und selectierte Zellen entsprechnend Deinen Wünschen zeichnen.

Helmi 2. Jan 2006 22:31

Re: StringGrid: eine Zeile markieren?
 
Zitat:

Zitat von Lannes
Hallo,

in Deiner OnDrawCell-Behandlungs-Routine werden selectierte Zellen wie normale gezeichnet.
Füge mal die markierte Zeile in die Prozedur ein,
dann klappt erst mal die Selectierung.
Delphi-Quellcode:
//...
begin
  with (Sender as TStringGrid), Canvas do
    if not (gdSelected in State) then//<----------- !!!
    begin
    //...
Dann die Procedur zu OnDrawCell erweitern
und selectierte Zellen entsprechnend Deinen Wünschen zeichnen.

Danke für deinen Tip.

Ich hab jetzt folgendes gemacht:
Delphi-Quellcode:
begin
  with (Sender as TStringGrid), Canvas do
    if not (gdSelected in State) then
      begin
        { ... }
      end
    else
      begin
        //NEUER PART      
   
        Canvas.Brush.Color := clBlue;

        TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
        FrameRect(Rect);
      end;
Jetzt kann ich nur noch hoffen, dass die Markierungsfarbe immer clBlue ist :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz