Delphi-Version: 5
Zellinhalt eines Stringgrid
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. |
AW: Zellinhalt eines Stringgrid
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; |
AW: Zellinhalt eines Stringgrid
Zitat:
Gruss Hans |
AW: Zellinhalt eines Stringgrid
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
Delphi-Quellcode:
)
CanSelect := False;
und daher die Grid-Property noch die alten Werte haben dürften. Zitat:
Delphi-Quellcode:
und schon braucht es keinen unnötigen Kommentar mehr. :zwinker:
... + StringGrid1.FixedRows;
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:
Abgesehn von dem kleinen Delphi-Bug,
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; gibt es manchmal auch unterschiedliche Lösungen. |
AW: Zellinhalt eines Stringgrid
Zitat:
Gruss und schönes Wochenende Hans |
AW: Zellinhalt eines Stringgrid
Zitat:
Zitat:
Zitat:
Zitat:
Aber ... eine Frage noch aus Interesse: Zitat:
Delphi-Quellcode:
schreibst sondern das "var" mitten in die Schleife. Das mag kürzer sein aber ist das nicht unübersichtlicher ?
var
i: integer Gruss Hans |
AW: Zellinhalt eines Stringgrid
Zitat:
Nur dass dabei nicht noch sinnlos in die anderen globalen Variablen umkopiert wird.
Delphi-Quellcode:
Natürlich gibt es für alles gefühlt 2 Milliarden Lösungen
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;
Delphi-Quellcode:
Button1.Caption := ARow.ToString + ' / ' + ACol.ToString + ' / ' + StringGrid1.Cells[ACol, ARow];
Delphi-Quellcode:
Button1.Caption := Format('%d / %d / %s', [ARow, ACol, StringGrid1.Cells[ACol, ARow]);
Zitat:
Aber nee, das FixedRows steht bereits initial auf 1 und mußte somit doch nicht vorher einstestellt werden, z.B. auch im Objekt-Inspektor. Zitat:
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. :D 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-Quellcode:
steht da jetzt bei dir, siehe ganz oben, aber das ist auch die Standardangabe, wenn jemand es vergisst)
Delphi-Version: 5
|
AW: Zellinhalt eines Stringgrid
Zitat:
Delphi-Quellcode:
korrekt, aber nicht wegen FixedRow, sondern einfach weil die neue Zelle unter der aktuellen liegt.
YPos := StringGrid1.Row +1; {+1 wegen der FixedRow}
XPos := StringGrid1.Col; |
AW: Zellinhalt eines Stringgrid
Zitat:
Gruss Hans |
AW: Zellinhalt eines Stringgrid
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;
Delphi-Quellcode:
... + 1; {+1 wegen der FixedRow}
versus
Delphi-Quellcode:
... + StringGrid1.FixedRows;
bezog sich auch nur auf den Code selber, nicht auf dessen Funktion, bezüglich diesem Fall hier. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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