![]() |
TStringGrid in Delphi7 und XE
In Delphi7 funktioniert StringGrid1.Cells[] und Form1.StringGrid1.Cells[] einwandfrei. In XE4-5 werden die Werte mit Form1.StringGrid1.Cells[] nicht angezeigt. Gibt es eine Lösung?
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
var n : integer; begin StringGrid1.RowCount:= 5; StringGrid1.ColCount:= 3; StringGrid1.Cells[0,0]:= 'LNr'; for n:= 1 to 4 do begin StringGrid1.Cells[0,n]:= IntToStr(n); StringGrid1.Cells[1,n]:= IntToStr(n*10); StringGrid1.Cells[2,n]:= IntToStr(n*100); end; end; procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Label1.Caption:= StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]; Label2.Caption:= Form1.StringGrid1.Cells[Form1.StringGrid1.Col,Form1.StringGrid1.Row]; end; |
AW: TStringGrid in Delphi7 und XE
Und wenn Du die benannte Instanz weglässt wie in der Zeile darüber auch?
|
AW: TStringGrid in Delphi7 und XE
Also wenn du mit .cells die Zellen füllen kannst, dann kannst du sie genauso auch wieder auslesen. Mir fällt auf, dass du OnMouseUp verwendest und dort X und Y nicht auswertest um die richtige Zelle zu erwischen. Was steht denn in Form1.StringGrid1.Col bzw. Form1.StringGrid1.Row so drin?
|
AW: TStringGrid in Delphi7 und XE
Ohne Instanz ist OK. Das ist nur als Beispiel. Ich brauche aber mit Instanz - Anruf von anderer Unit.
|
AW: TStringGrid in Delphi7 und XE
Stimmt die Instanz? Ist dort auch die korrekte Zelle markiert? Sollte man nicht lieber Logik und Darstellung trennen?
|
AW: TStringGrid in Delphi7 und XE
Zitat:
|
AW: TStringGrid in Delphi7 und XE
In richtigem Programm habe ich public function gemacht, aber das Problem bleibt.
|
AW: TStringGrid in Delphi7 und XE
Delphi-Quellcode:
Woher bekommst Du denn hier die Spalten- und Zeilekoordianten her?
procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin Label1.Caption:= StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]; Label2.Caption:= Form1.StringGrid1.Cells[Form1.StringGrid1.Col,Form1.StringGrid1.Row]; end; Solltest Du die X,Y Werte nicht in GridKoordinaten umwandeln und dann benutzen? Grüße Klaus |
AW: TStringGrid in Delphi7 und XE
Das braucht man nicht.
Es geht nur um Form1.StringGrid1.Cells und StringGrid1.Cells |
AW: TStringGrid in Delphi7 und XE
Hast Du meine Nachfragen aus #5 schon geprüft?
|
AW: TStringGrid in Delphi7 und XE
Ich habe geprüft. Das gleiche Code ist mit D7 OK in XE5 nicht.
|
AW: TStringGrid in Delphi7 und XE
Ich hab kein XE5, daher kann ich das nicht verifizieren. Trotzdem würde ich noch einmal prüfen, ob die Instanz stimmt und welche Werte Col und Row von dessen StringGrid aktuell aufweisen.
|
AW: TStringGrid in Delphi7 und XE
Also im XE hab ichs eben versucht, da funktioniert es noch, eine höhere Version habe ich leider nicht.
Delphi-Quellcode:
type
TForm1 = class(TForm) StringGrid1: TStringGrid; Label1: TLabel; Label2: TLabel; procedure FormActivate(Sender: TObject); procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormActivate(Sender: TObject); var n : integer; begin StringGrid1.RowCount:= 5; StringGrid1.ColCount:= 3; StringGrid1.Cells[0,0]:= 'LNr'; for n:= 1 to 4 do begin StringGrid1.Cells[0,n]:= IntToStr(n); StringGrid1.Cells[1,n]:= IntToStr(n*10); StringGrid1.Cells[2,n]:= IntToStr(n*100); end; end; procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Label1.Caption:= StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]; Label2.Caption:= Form1.StringGrid1.Cells[Form1.StringGrid1.Col,Form1.StringGrid1.Row]; end; |
AW: TStringGrid in Delphi7 und XE
Hast du vielleicht ein Testprojekt, das du hier anhängen kannst? Denn ohne zu wissen welche Formulare da erstellt werden, sprich ob Form1 überhaupt stimmt usw. lässt sich da nicht viel zu sagen.
|
AW: TStringGrid in Delphi7 und XE
Hier ist link zu Projekt im D7 und XE5.
![]() ![]() |
AW: TStringGrid in Delphi7 und XE
Delphi-Quellcode:
program Project1;
uses Vcl.Forms, Unit1 in '..\test7\Unit1.pas' {Form1}; // ist das wirklich die richtige unit????? {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); // warum eigentlich 2mal????? Application.CreateForm(TForm1, Form1); // warum eigentlich 2mal????? Application.Run; end. |
AW: TStringGrid in Delphi7 und XE
Du machst einen ganz bösen Fehler indem du innerhalb der Klasse
Delphi-Quellcode:
auf die Instanz
TForm1
Delphi-Quellcode:
zugreifst!!!
Form1
Jede Methode hat einen versteckten Parameter mit dem Namen self. Zu Verdeutlichung ändere ich die Methode in eine Procedure und übergebe den Self-Parameter:
Delphi-Quellcode:
Da aber self und Form1 auf unterschiedliche Objekte verweisen können, bringt dich die Benüzung von Form1 in Teufels Küche.
procedure TForm1__StringGrid1MouseUp(Self: TForm1; Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin Self.Label1.Caption:= Self.StringGrid1.Cells[ self.StringGrid1.Col, self.StringGrid1.Row]; Self.Label2.Caption:= Form1.StringGrid1.Cells[Form1.StringGrid1.Col,Form1.StringGrid1.Row]; end; Innerhalb einer Klasse anstatt über self auf Form1 zuzugreifen ist ganz eindeutig ein Fehler! |
AW: TStringGrid in Delphi7 und XE
Das Projekt, wenn man es angepasst hat (UNIT-Verzeichnis), zeigt in der Tat den Fehler....
Fügt man die Unit in ein neues Projekt ein, so funktioniert's. Also/Lösung: Neues Projekt aufmachen und die Units rüberziehen (oder wahlweise die Projekteinstellungen vergleich/angleichen) |
AW: TStringGrid in Delphi7 und XE
Zitat:
|
AW: TStringGrid in Delphi7 und XE
Ich habe übersehen dass Compiler 2x Application.CreateForm(TForm1, Form1);
geschrieben hat. Das war Grund für den Fehler. |
AW: TStringGrid in Delphi7 und XE
Gut das es gelöst ist :-)
Das erklärt auch, warum es in einem neuen Projekt funktioniert.... habe ich übersehen :-) (wer guckt da schon hin :-)) Naja.... doppelt gemoppelt hält nicht besser ;-) |
AW: TStringGrid in Delphi7 und XE
Zitat:
Aber Fehler bleibt Fehler und die Ursache zu finden weshalb ein fehlerhafter Code mal funktioniert und mal nicht ist eher nachrangig. Wichtiger ist IMHO den Fehler zu erkennen und auszumerzen. |
AW: TStringGrid in Delphi7 und XE
Er wollte aus einem anderen Formular heraus auf das Stringgrid in Form1 zugreifen. Ob das elegant ist oder nicht, sei dahingestellt, aber jetzt ein Fass aufzumachen von wegen Fehler halte ich für übertrieben.
|
AW: TStringGrid in Delphi7 und XE
Unterschied zwischen D7 und XE: wenn man mit der Taste „Datei zum Projekt hinzufügen“ mehrfach dieselbe Datei öffne.
Mit D7 kommt zu keinem Fehler, mit XE werden jedes Mal gleiche Unit instanziiert und das führt zu den Fehler (wie oben beschrieben). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz