AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi StringGrid mit spezieller Auswahlmöglichkeit
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid mit spezieller Auswahlmöglichkeit

Ein Thema von sakura · begonnen am 2. Jul 2004
Antwort Antwort
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#1

StringGrid mit spezieller Auswahlmöglichkeit

  Alt 2. Jul 2004, 08:30
Entstanden als Antwort auf diesen Thread: http://www.delphipraxis.net/internal...ct.php?t=28965

So, nun zur "schnellen Lösung", auch wenn diese nicht unbedingt die schönste ist. (Geht nur unter Win16/Win32, nicht .NET!)

Das StringGrid bietet uns für jede Zelle zwei Eigenschaften. Einmal den Text, welcher darzustellen ist (StringGrid.Cells[Spalte, Zeile]) und einmal dürfen wir für jede Zelle ein verbundenes Objekt [StringGrid.Objects[Spalte, Zeile] definieren.

Die hier vorgestellte Lösung bindet sich an die verbundenen Objekte an und geht davon aus, daß diese noch nicht anderweitig genutzt sind! Solltest Du die schon genutzt haben, dann mußt Du die Lösung entsprechend anpassen.

Wird eine Zelle markiert, so setze ich den Pointer für den entsprechenden Objekteintrag einfach auf 1StringGrid.Objects[Spalte, Zeile] := Pointer(1); Jetzt ist da kein Objekt drinne - also nicht darauf zugreifen, aber daß interessiert Delphi nicht Wird die Zelle wieder abgewählt, so setzen wir den Objekteintrag auf nil. Nicht freigeben, da ja kein echtes Objekt vorliegt. Sonst führt das zu einer AV

Jetzt müssen wir uns nur noch um die Darstellung kümmern. Dieses geht am einfachsten, indem wir das OnDrawCell Ereignis abfangen und selbst zeichnen. Jetzt müssen wir nur noch testen, ob die Zeile markiert ist if StringGrid.Objects[Spalte, Zeile] <> nil then oder nicht und die entsprechenden Farben auswählen. Anschließend wird der Text noch dargestellt und alles sollte laufen

Anbei das Demo-Projekt zu dieser Theorie mit allen nötigen Sourcen.

Die wichtigsten Code-Ausschnitte:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  [...]
  with Sender as TStringGrid do
  begin
    [...]
    // select color
    if Objects[ACol, ARow] = nil then
    begin
      // cell not selected
      Canvas.Brush.Color := clWindow;
      Canvas.Font.Color := clWindowText;
    end else begin
      [...]
    end;
    // draw cell
    Canvas.TextRect(Rect, Rect.Left, Rect.Top, Cells[ACol, ARow]);
  end;
end;

procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  [...]
  with Sender as TStringGrid do
    if Key = VK_SPACE then
      if Objects[Col, Row] = nil then
        Objects[Col, Row] := Pointer(1)
      else
        Objects[Col, Row] := nil;
end;
......

P.S.: Anbei noch ein ScreenShot
Miniaturansicht angehängter Grafiken
dp_803.gif  
Angehängte Dateien
Dateityp: zip selection_grid.zip (1,8 KB, 192x aufgerufen)
Daniel W.
Ich bin nicht zurück, ich tue nur so
  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 18:42 Uhr.
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