Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringGrid - Reihen - Spalten - Schnittpunkt Markieren (https://www.delphipraxis.net/179751-stringgrid-reihen-spalten-schnittpunkt-markieren.html)

axellang 29. Mär 2014 12:52

StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

nachdem ich vieles probiert und ebenso gesucht habe brauche ich eure Hilfe.

In einem StringGrid, verwende das von den JEDIs (TJvStringGrid), soll beim MouseOver (MouseUp würde auch gehen)
die Spalte wie auch die Reihe bis einschließlich zum Cursor markiert werden.

Um das besser zu verdeutlichen habe ich ein Bild erstellt das zeigt wie es aussehen soll.

Bitte um Tipps...

Danke, Axel

mkinzler 29. Mär 2014 19:21

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Und was ist geanu Dein Problem? Die Ermittlung oder das Einfärben.

axellang 30. Mär 2014 12:34

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Zitat:

Zitat von mkinzler (Beitrag 1253943)
Und was ist geanu Dein Problem? Die Ermittlung oder das Einfärben.

Hallo,

die Ermittlung (zum Teil) sowie das Einfärben.
Ich schaffe es nur waagerecht oder senkrecht bis zur Cursorposition einzufärben aber nicht beide zugleich.

Axel

Perlsau 30. Mär 2014 13:21

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Zitat:

Zitat von axellang (Beitrag 1254011)
Ich schaffe es nur waagerecht oder senkrecht bis zur Cursorposition einzufärben aber nicht beide zugleich.

Zeig doch einfach mal, was du bislang hast. Wie gehst du das an?

axellang 30. Mär 2014 14:03

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Hallo,

zB. senkrecht markieren in MouseMove.
Aber wie gesagt, beide krieg ich nicht hin.

//TEST
Delphi-Quellcode:
procedure TfrmKeyCard.SGMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  GR : TGridRect;
  aCol, aRow : LongInt;
begin
  (* Returns the column and row of the cell at the
     position with screen coordinates (X,Y) *)
  SG.MouseToCell(X,Y,aCol,aRow);
  if (aCol = 0) or (aRow = 0) then
    Exit;

 // Grid Select
 GR.Left      := aCol;
 GR.Top       := 1;
 GR.Right     := aCol;
 GR.Bottom    := aRow;
 SG.Selection := GR;

end;
Axel

Perlsau 30. Mär 2014 14:07

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Stimmt, mit dieser Methode kriegst du immer nur ein Rechteck selektiert, da das Property Selection dabei überschrieben wird.

Weil ich das als interessante Herausforderung empfinde, werde ich da gleich mal ein wenig herumprobieren.

axellang 30. Mär 2014 14:23

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Ja das ist auch meine Kopfnuss.
Entweder waagerecht oder senkrecht aber nicht beide zugleich.

Ich hatte das schon mal gesehen. Html Tabelle und mit etwas Script konnte man das so machen.
Leider ist das mindestens 5-8 Jahre her so das ich keine Ahnung habe wo das war.
Sonnst hätte ich mir den JavaScript Code mal angesehen.

Ich gehe mal Radfahren, um nachzudenken.

Axel

PS: Danke für die Hilfe...

Perlsau 30. Mär 2014 14:43

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Soll die Markierung bestehen bleiben, wenn man die Maustaste wieder losläßt?

Mein Ansatz war jetzt folgender: Du hast zwei globale private Variablen, einmal GrSpalte und einmal GrZeile, die du im OnCreate des Forms auf -1 setzt. Beim Drücken mit der linken Maustaste werden diesen Variablen ACol und ARow der gedrückten Zelle zugewiesen, beim Loslassen wieder auf -1 gesetzt. Bei beiden Ereignissen wird dann StringGrid.Paint aufgerufen, wo State auf gdSelected gesetzt wird.
Delphi-Quellcode:
procedure TFormMain.StrGridTestDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if (Spalte < 0) or (Zeile < 0) then Exit;


  if ((ACol <= Spalte) and (ARow = Zeile)) or
     ((ACol = Spalte) and (ARow <= Zeile)) then
      State := [gdSelected] else
      State := [];
end;
Aber das funktioniert auch nicht: Es wird auch hier immer nur die entsprechende Zeile, nicht aber die entsprechende Spalte markiert. Man könnte jetzt noch versuchen, diese Markierung selber zu malen, indem man die Zelle mit einer bestimmten Farbe füllt.

Apropo Radfahren und Sonne genießen: Gute Idee, werd' ich jetzt auch erst mal machen :thumb:

axellang 31. Mär 2014 09:54

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Hi,

nachdem ich mir das Hirn beim Radfahren frei gepustet und die Einkehr im Biergarten den Rest besorgte, habe ich es heute wie folgt gelöst.

// UPDATE
Delphi-Quellcode:
private
procedure DynamicGridSelector(Sender: TObject);

//...

procedure TForm1.DynamicGridSelector(Sender: TObject);
var
  i : integer;
begin
   with TStringGrid(Sender) do
    begin
      for i := 0 to ColCount - 1 do
        Objects[i, 0] := TObject(i in [Selection.Left..Selection.Right]);
      for i := 0 to RowCount - 1 do
        Objects[0, i] := TObject(i in [Selection.Top..Selection.Bottom]);
    end;
end;

procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  vRect: TRect;
begin
  with TStringGrid(Sender) do
    begin
      // Überschriften
      if (gdFixed in State) then
        begin
          if LongBool(Objects[ACol, ARow]) then
            begin
              Canvas.Font.Color := RGB(255,255,255);
              Canvas.Brush.Color := RGB(240,0,120);
            end;
        end;

      // GridFelder
      if (gdSelected in State) and not (gdFixed in State) then
        begin
          Canvas.Font.Color := RGB(255,255,255);
          Canvas.Font.Style := [fsBold];
          Canvas.Brush.Color := RGB(240,0,120);
        end;

      // Dummy
      vRect.Top  := Rect.Top;
      vRect.Left := Rect.Left-4;
      vRect.Right := Rect.Right;
      vRect.Bottom := Rect.Bottom;

      Canvas.FillRect(vRect);
      Canvas.TextOut(Rect.Left+2, Rect.Top+2, SG.Cells[ACol, ARow]);
    end;

end;

procedure TForm1.SGMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  DynamicGridSelector(Sender);
end;

procedure TForm1.SGMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  DynamicGridSelector(Sender);
end;

Es ist zwar nicht so wie ich mir das vorstellte, aber damit kann man leben.
Vielleicht fällt es mir in ein paar Tagen ein, wie es geht ;-)


Es ging darum dem Benutzer eine optische Hilfe anzubieten, um bei der Auswahl im Grid
die Überschrift (ACol[0] und ARow[0]) in Verbindung mit dem ausgewählten Wert schnell und bequem zuzuordnen.

Obwohl es im MouseMove steht muss man, damit der Effekt feuert, die Maustaste gedrückt halten.

Axel

Perlsau 31. Mär 2014 09:58

AW: StringGrid - Reihen - Spalten - Schnittpunkt Markieren
 
Eine Alternative wäre vielleicht noch gewesen, lediglich die beiden jeweiligen Fixed-Felder oben und links zu verändern bzw. farblich hervorzuheben.

Übrings ist klar, weshalb man die Maustaste gedrückt halten muß: Beim reinen Bewegen über eine Zelle wird ja nichts selektiert. Du greifst aber auf die Daten einer selektierten Zelle zurück.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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