Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 selection Problem ! (https://www.delphipraxis.net/25150-stringgrid-selection-problem.html)

richard_boderich 1. Jul 2004 22:49


Stringgrid selection Problem !
 
Hi leute,

hab ein großes Problem, nachdem ich beim coden so richtig
in fahrt gekommen bin, musste ich leider feststellen,das
das Stringgrid so bloede markiert, immer nur ein viereckiger
bereich, ich MUSS es aber so hinkriegen, das das stringgrid so
markiert wie ein Memo oder Richedit, sonst waren zweieinhalb
Wochen Arbeit umsonst, und ehrlich gesagt wuerde ich das
Project eher hinschmeissen als komplett von vorn anzufangen.
also bitte , sagt mir man kann den markierungsmodus vom grid umschalten

ich hoffe wirklich jemand kann mir weiterhelfen

:pale:

sakura 2. Jul 2004 08:18

Re: Stringgrid selection Problem !
 
Liste der Anhänge anzeigen (Anzahl: 1)
Erst einmal die schlechte Nachricht :mrgreen:

TStringGrid kann es nicht, genauso wie auch das TDrawGrid von Delphi. Die Ursache hier liegt etwas tiefer begraben. Das Delphi-Grid merkt sich ausschließlich das markierte Rechteck in der Eigenschaft Selection
Delphi-Quellcode:
type
  TGridRect = record
    case Integer of
      0: (Left, Top, Right, Bottom: Longint);
      1: (TopLeft, BottomRight: TGridCoord);
  end;

  TCustomGrid = class(TCustomControl)
    ...
    property Selection: TGridRect read GetSelection write SetSelection;
    ...
  end;
Daran lässt sich auch erkennen, daß sich dieses nicht ohne weiteres umgehen lässt. Nun gibt es zwei grundlegende Möglichkeiten. Die erste wäre die Nutzung einer anderen Komponente, was schnell zu Problemen führen kann, die zweite ist es, das Verhalten des StringGrids etwas abzuändern :-)

Anbei mal ein ScreenShot des geänderten StringGrid. Nachteilig an dieser Lösung ist, daß das Normale Verhalten des StringGrid (auswahl über Maus, Shift+Cursor) nicht mehr geht, außer Du nimmst Dich dieses Problemes an und änderst das auch noch - mir fehlt jetzt die Zeit.

Mehr in ein paar Minuten.

...:cat:...

sakura 2. Jul 2004 08:31

Re: Stringgrid selection Problem !
 
So, die Lösung habe ich gleich in die CodeLib befördert. Hier: http://www.delphipraxis.net/internal...=198202#198202

Viel Erfolg. Wenn Du Fragen hast, bitte in Deinem (diesen!) Thread. Danke.

...:cat:...

richard_boderich 2. Jul 2004 09:35

Re: Stringgrid selection Problem !
 
hallo sakura,

habe mir dein screenshot angesehen, und
ich glaube du hast mich falsch verstanden, (oder ich verstehen dein
screeshot falsch).

ich will keine multiselectionen haben, ich will nur, das wenn ich in die mitte einer zeile
mit der makierung anfange, und z.b. eine zeile runter gehe, die markierung wieder
bis zur mitte der zeile geht ->> kein rechteckiger bereich

was ich bei dir gesehen hab, waren doch multiselectierte bereiche oder ??

sakura 2. Jul 2004 09:44

Re: Stringgrid selection Problem !
 
Zitat:

Zitat von richard_boderich
ich will keine multiselectionen haben, ich will nur, das wenn ich in die mitte einer zeile
mit der makierung anfange, und z.b. eine zeile runter gehe, die markierung wieder
bis zur mitte der zeile geht ->> kein rechteckiger bereich

Sorry, aber Bahnhof. Zeichne doch mal ein Bild mit einem Beispiel :?

...:cat:...

richard_boderich 2. Jul 2004 10:10

Re: Stringgrid selection Problem !
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi sakura,

also ich hab mal ein screenshot beigefügt, zu sagen waere
noch , das ich das grid manuell mit daten gefuettert habe,
die zellen sind also nicht mit irgendeiner festgelegten datenbankstruktur verknuepft,
sondern mit einem array, gibt also keinen grund, warum ich nur rechteckig markieren sollte :)

zum screenshoot: stelle dir einfach vor, die buchstaben seien einzelne zellen,
und ich will immer nur einen zusammenhaegenden bereich , kein multiselekt!

Die hoffnung stirbt zuletzt, danke für deine hilfe :|

sakura 2. Jul 2004 10:30

Re: Stringgrid selection Problem !
 
Okay, verstanden und ... ;) gelöst.

Das ist schon etwas einfacher. Du mußt zwei Ereignisse abfangen. Einmal das OnSelectCell, um dem StringGrid mitzuteilen, daß sich die Auswahl grundlegend geändert hat, und einmal das OnDrawCell Ereigniss, um die Auswahl darzustellen.

Außerdem habe ich noch eine Methode geschrieben, welche ermittelt, ob sich eine Zelle (Spalte, Zeile) in der erweiterten Auswahl befindet.

Hier die drei Methoden und es geht.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    [...]
  private
    { Private declarations }
    function CellInRange(aGrid: TCustomDrawGrid; aCol, aRow: Integer): Boolean;
    [...]
  end;

// testen, ob sich eine bestimmte Zelle in der erweiterten Auswahl aufhält
function TForm1.CellInRange(aGrid: TCustomDrawGrid; aCol, aRow: Integer
    ): Boolean;
begin
  Result := False;
  if aRow < aGrid.Selection.Top then
    Exit;
  if aRow = aGrid.Selection.Top then
    if aCol < aGrid.Selection.Left then
      Exit;
  if aRow > aGrid.Selection.Bottom then
    Exit;
  if aRow = aGrid.Selection.Bottom then
    if aCol > aGrid.Selection.Right then
      Exit;
  Result := True;
end;

// die Ereignisroutinen
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if Sender = nil then
    Exit;
  if not (Sender is TStringGrid) then
    Exit;
  with Sender as TStringGrid do
  begin
    // skip fixed columns
    if (ACol < FixedCols) or (ARow < FixedRows) then
      Exit;
    // select color
    if CellInRange(Sender as TStringGrid, ACol, ARow) then
    begin
      // selected cell
      Canvas.Brush.Color := clHighlight;
      Canvas.Font.Color := clHighlightText;
    end else begin
      // cell not selected
      Canvas.Brush.Color := clWindow;
      Canvas.Font.Color := clWindowText;
    end;
    // draw cell
    Canvas.TextRect(Rect, Rect.Left, Rect.Top, Cells[ACol, ARow]);
  end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  if Sender = nil then
    Exit;
  if not (Sender is TStringGrid) then
    Exit;
  with Sender as TStringGrid do
  begin
    Update;
    Invalidate;
  end;
end;
...:cat:...

richard_boderich 2. Jul 2004 11:21

Re: Stringgrid selection Problem !
 
mahlzeit,

also dein code funktioniert bei mir nich, habs mal gerade in einem
testproject getestet (neue form und nur 1 stringgrid)
macht nicht das was es soll, entweder ist der code fehlerhaft, oder
wir reden aneinander vorbei. es muss so sein:

wenn du z. b. die markierung in der mitte von zeile 1 anfaengst
, und gehst nach zeile 3. dann ist die rechte haelfte von zeile
1 markiert, die komplette zeile 2 und die linke haelfte von
zeile 3

muss so sein weil eindimensionales array(werte alle hintereinander);

aber

stringgrid stellt zu 32 col breite dar, dann gehts weiter in naechster zeile

arrayposotion berechet sich folgendermaßen: (acol)+(arow * 32)

verstehst du, ich muss sozusagen wenn ich eine zeile runter gehe beim markieren,
alle zellen die zwischen erster und letzter sind markieren koennen, um alle korrekten arraypositionen zu erhalten

ich hoffe ich habs dir jetz richtig erklaeren koennen

sakura 2. Jul 2004 11:29

Re: Stringgrid selection Problem !
 
Genauso lief der Code auch bei mir. Was für eine Delphiversion hast Du denn? Hast Du das OnSelectCell Ereignis eingesetzt?

...:cat:...

richard_boderich 2. Jul 2004 12:30

Re: Stringgrid selection Problem !
 
Liste der Anhänge anzeigen (Anzahl: 1)
mahlzeit,

also habs nochmal getestet. beide ereignisse sind gesetzt, onselectcell und ondrawcell

wenn ich markiere, zeichet er ein rechteck von linksoben nach rechstunten.
ich kann zwar wenn ich rechtsunten die maus nach links bewege zellen abwaehlen, aber das is nich das was ich
brauche. er selectiert , die rows ZWISCHEN 1 markierter zeile und letzter markierter zeile nicht vollstaendig,
sondern nur ab der col position, die ich hab, wenn ich die markierung beginne.

ich glaub du hast mich doch nicht verstanden

mach dir mal ne leere form, memo drauf, ausfuehren,

bisserl text reinschreiben oder kopieren, idealerweise gleichlange zeilen,
und dann guck dir mal an wie memo markiert.


schicke dir auch mein testproject , was ich zum testen deines codes nutze, vielleicht hab ich
ja auch einen fehler drin :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.
Seite 1 von 4  1 23     Letzte »    

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