AGB  ·  Datenschutz  ·  Impressum  







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

Zellinhalt eines Stringgrid

Ein Thema von H.Bothur · begonnen am 4. Aug 2023 · letzter Beitrag vom 7. Aug 2023
Antwort Antwort
Seite 1 von 2  1 2      
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#1

Zellinhalt eines Stringgrid

  Alt 4. Aug 2023, 15:41
Delphi-Version: 5
Moin,

ich habe hier ein kleines Testprogramm - ein Stringgrid mit 5 Reihen und 3 Spalten und einem Button. Und immer wenn ich mit dem Cursur in eine andere Zelle gehe sollte mir die Zeile und Spalte und der Zellinhalt angezeigt werden.

Das klappt auch im ersten Moment mit CirsorDown, nur sobald ich wider CursorUp mache stimmen die angezeigten Daten nicht mehr.

Was stimmt da mit mir nicht ??

Hans

Delphi-Quellcode:
unit TestUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

var
  XPos,
  YPos: Integer;
  ZellInhalt: String;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[0,0]:='Spalte 1';
  StringGrid1.Cells[1,0]:='Spalte 2';
  StringGrid1.Cells[2,0]:='Spalte 3';

  StringGrid1.Cells[0, 1] := 'Apfel';
  StringGrid1.Cells[1, 1] := 'Birne';
  StringGrid1.Cells[2, 1] := 'Pflaume';

  StringGrid1.Cells[0, 2] := 'Erbse';
  StringGrid1.Cells[1, 2] := 'Wurzeln';
  StringGrid1.Cells[2, 2] := 'Kartoffel';

  StringGrid1.Cells[0, 3] := 'Fleisch';
  StringGrid1.Cells[1, 3] := 'Fisch';
  StringGrid1.Cells[2, 3] := 'Wild';

  StringGrid1.Cells[0, 4] := 'Vorspeise';
  StringGrid1.Cells[1, 4] := 'Hauptspeise';
  StringGrid1.Cells[2, 4] := 'Nachtisch';
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  YPos := StringGrid1.Row +1; {+1 wegen der FixedRow}
  XPos := StringGrid1.Col;
  ZellInhalt := StringGrid1.Cells[XPos, YPos];
  Button1.Caption := IntToStr(YPos) + ' / ' +IntToStr(XPos) + ' / ' +ZellInhalt;
  Button1.Refresh;
end;

end.
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zellinhalt eines Stringgrid

  Alt 4. Aug 2023, 16:02
So sollte es doch gehen oder nicht?

Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  YPos := ARow;
  XPos := ACol;
  ZellInhalt := StringGrid1.Cells[XPos, YPos];
  Button1.Caption := IntToStr(YPos) + ' / ' +IntToStr(XPos) + ' / ' +ZellInhalt;
  Button1.Refresh;
end;
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Zellinhalt eines Stringgrid

  Alt 4. Aug 2023, 16:55
So sollte es doch gehen oder nicht?

Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  YPos := ARow;
  XPos := ACol;
  ZellInhalt := StringGrid1.Cells[XPos, YPos];
  Button1.Caption := IntToStr(YPos) + ' / ' +IntToStr(XPos) + ' / ' +ZellInhalt;
  Button1.Refresh;
end;
Danke - ich bin gerade unterwegs und teste das morgen mal.

Gruss
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.150 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zellinhalt eines Stringgrid

  Alt 4. Aug 2023, 17:21
Ja, wenn man schon die "richtigen" Werte als Parameter rein bekommt, dann könnte man sie auch benutzen,
vor allem, da OnSelectCell bestimmt vor der Select-Änderung aufgerufen wird (drum ist es hier auch möglich das noch zu verbieten CanSelect := False; )
und daher die Grid-Property noch die alten Werte haben dürften.

Zitat:
{+1 wegen der FixedRow}
Warum dann nicht direkt ... + StringGrid1.FixedRows; und schon braucht es keinen unnötigen Kommentar mehr.

Wenn ich das FormCreate sehe und dort nichts im Code zu finden ist ... Im Designer wurde die Größe des Grids aber schon eingestellt?

PS: Für die globalen Variablen sollte jemand mindestens gevierteilt werden.


Info:
Delphi-Quellcode:
procedure TForm4.FormCreate(Sender: TObject);
begin
  for var i := StringGrid1.RowCount - 1 downto 0 do StringGrid1.Rows[i].StrictDelimiter := True; // wirst schon sehn was passiert, wenn du diese Zeile weg lässt (schade, dass Emba das nicht RICHTIG repariert hatte)
  StringGrid1.Rows[0].CommaText := 'Spalte 1,Spalte 2,Spalte 3';
  StringGrid1.Rows[1].CommaText := 'Apfel,Birne,Pflaume';
  ...
end;
Abgesehn von dem kleinen Delphi-Bug,
gibt es manchmal auch unterschiedliche Lösungen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Aug 2023 um 17:31 Uhr)
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Zellinhalt eines Stringgrid

  Alt 5. Aug 2023, 11:06
So sollte es doch gehen oder nicht?

Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  YPos := ARow;
  XPos := ACol;
  ZellInhalt := StringGrid1.Cells[XPos, YPos];
  Button1.Caption := IntToStr(YPos) + ' / ' +IntToStr(XPos) + ' / ' +ZellInhalt;
  Button1.Refresh;
end;
Danke - so passt es

Gruss und schönes Wochenende
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Zellinhalt eines Stringgrid

  Alt 5. Aug 2023, 11:18
Ja, wenn man schon die "richtigen" Werte als Parameter rein bekommt, dann könnte man sie auch benutzen,
vor allem, da OnSelectCell bestimmt vor der Select-Änderung aufgerufen wird (drum ist es hier auch möglich das noch zu verbieten CanSelect := False; )
und daher die Grid-Property noch die alten Werte haben dürften.
Ja - wobei das irgendwie nicht das verhalten "meiner" ersten Lösung erklärt - denn das Ereignis ist ja das gleiche.

Zitat:
Warum dann nicht direkt ... + StringGrid1.FixedRows; und schon braucht es keinen unnötigen Kommentar mehr.
Das kannte ich noch nicht

Zitat:
Wenn ich das FormCreate sehe und dort nichts im Code zu finden ist ... Im Designer wurde die Größe des Grids aber schon eingestellt?
Ja klar - da war aber nur FixedRow, ColCount und RowCount eingestellt.

Zitat:
Delphi-Quellcode:
procedure TForm4.FormCreate(Sender: TObject);
begin
  for var i := StringGrid1.RowCount - 1 downto 0 do StringGrid1.Rows[i].StrictDelimiter := True; // wirst schon sehn was passiert, wenn du diese Zeile weg lässt (schade, dass Emba das nicht RICHTIG repariert hatte)
  StringGrid1.Rows[0].CommaText := 'Spalte 1,Spalte 2,Spalte 3';
  StringGrid1.Rows[1].CommaText := 'Apfel,Birne,Pflaume';
  ...
end;
Sehr viel eleganter - Danke. Ich hoffe ich denke das nächste Mal dran wenn ich es brauche.

Aber ... eine Frage noch aus Interesse:

Zitat:
Delphi-Quellcode:
procedure TForm4.FormCreate(Sender: TObject);
begin
  for var i := StringGrid1.RowCount - 1 downto 0 do
Ich sehe das Du nicht extra
Delphi-Quellcode:
var
  i: integer
schreibst sondern das "var" mitten in die Schleife. Das mag kürzer sein aber ist das nicht unübersichtlicher ?

Gruss
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.150 Beiträge
 
Delphi 12 Athens
 
#7

AW: Zellinhalt eines Stringgrid

  Alt 5. Aug 2023, 11:40
Ja - wobei das irgendwie nicht das verhalten "meiner" ersten Lösung erklärt - denn das Ereignis ist ja das gleiche.
Es ist die Erklärung für die Lösung von Rolf.
Nur dass dabei nicht noch sinnlos in die anderen globalen Variablen umkopiert wird.
Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  Button1.Caption := IntToStr(ARow) + ' / ' + IntToStr(ACol) + ' / ' + StringGrid1.Cells[ACol, ARow];
  Button1.Refresh;
end;
Natürlich gibt es für alles gefühlt 2 Milliarden Lösungen
Button1.Caption := ARow.ToString + ' / ' + ACol.ToString + ' / ' + StringGrid1.Cells[ACol, ARow];
Button1.Caption := Format('%d / %d / %s', [ARow, ACol, StringGrid1.Cells[ACol, ARow]);

Das kannte ich noch nicht
Wollte erst sagen, doch, weil du hast ja .....

Aber nee, das FixedRows steht bereits initial auf 1 und mußte somit doch nicht vorher einstestellt werden, z.B. auch im Objekt-Inspektor.

Aber ... eine Frage noch aus Interesse:
...
schreibst sondern das "var" mitten in die Schleife. Das mag kürzer sein aber ist das nicht unübersichtlicher ?
Inline-Variablen gibt es seit wenigen Jahren. (letzte 4-5 Delphi-Versionen, oder so)

Nja, das kann man so oder so sehn.
Persönlich sehe ich das grade für FOR-Schleifen einfach nur als genial an.
Es sind schon zu viele auf die blöde Idee gekommen, auf eine FOR-Variable außerhalb/nach der FOR-Schleife zuzugreifen, was man definitiv nicht tun sollte, weil gibt Probleme ... und was so nun auch garnicht mehr möglich ist.
https://docwiki.embarcadero.com/RADS...line-Variablen
https://www.delphipraxis.net/204421-...variablen.html
...

PS: In seinem Profil kann man seine Delphi-Version angeben (siehe links unter den Namen),
bzw. hier in diesem Unterforum war das beim Erstellen des Threads/ErsterPost auch möglich.
(Delphi-Version: 5 steht da jetzt bei dir, siehe ganz oben, aber das ist auch die Standardangabe, wenn jemand es vergisst)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Aug 2023 um 11:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zellinhalt eines Stringgrid

  Alt 5. Aug 2023, 12:11
Ja - wobei das irgendwie nicht das verhalten "meiner" ersten Lösung erklärt - denn das Ereignis ist ja das gleiche.
Das klappt nur dann, wenn du im Grid mit Pfeil-Ab in die darunter liegenden Zelle wechselst. In dem Fall ist nämlich deine Berechnung
Delphi-Quellcode:
  YPos := StringGrid1.Row +1; {+1 wegen der FixedRow}
  XPos := StringGrid1.Col;
korrekt, aber nicht wegen FixedRow, sondern einfach weil die neue Zelle unter der aktuellen liegt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
252 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Zellinhalt eines Stringgrid

  Alt 5. Aug 2023, 13:24
Ja - wobei das irgendwie nicht das verhalten "meiner" ersten Lösung erklärt - denn das Ereignis ist ja das gleiche.
Das klappt nur dann, wenn du im Grid mit Pfeil-Ab in die darunter liegenden Zelle wechselst. In dem Fall ist nämlich deine Berechnung
Delphi-Quellcode:
  YPos := StringGrid1.Row +1; {+1 wegen der FixedRow}
  XPos := StringGrid1.Col;
korrekt, aber nicht wegen FixedRow, sondern einfach weil die neue Zelle unter der aktuellen liegt.
Dann habe ich bei StringGrid.Row einfach was falsches erwartet - ich dachte das da immer die aktuelle Spalte drin steht - das was ich bei ARow rausbekomme. Aber was steht denn dann in Row ? Ich habe eben mal ein paar Minuten gesucht aber so auf die schnelle nichts dazu gefunden

Gruss
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.150 Beiträge
 
Delphi 12 Athens
 
#10

AW: Zellinhalt eines Stringgrid

  Alt 5. Aug 2023, 13:27
Ist es auch, inkl. der FixedRow.

Wie schon gesagt, kann es sein, dass beim Click mit Maus/Tastatur das Selected-Event schon vor dem Ändern aufgerufen wird und dann in diesen Property das Alte noch drin steht,
aber in den Parametern steht immer das Richtige.


Kannst auch einfach mal mit einem Timer testen, dann ist die interne Reihenfolge hierbei egal.
Delphi-Quellcode:
procedure TForm4.Timer1Timer(Sender: TObject);
begin
  Caption := StringGrid1.Row.ToString + ' ' + StringGrid1.Col.ToString;
end;



... + 1; {+1 wegen der FixedRow}
versus
... + StringGrid1.FixedRows;
bezog sich auch nur auf den Code selber,
nicht auf dessen Funktion, bezüglich diesem Fall hier.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Aug 2023 um 13:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:11 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