Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TStringGrid in Delphi7 und XE (https://www.delphipraxis.net/176590-tstringgrid-delphi7-und-xe.html)

jan001 16. Sep 2013 08:24

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;

DeddyH 16. Sep 2013 08:32

AW: TStringGrid in Delphi7 und XE
 
Und wenn Du die benannte Instanz weglässt wie in der Zeile darüber auch?

baumina 16. Sep 2013 08:34

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?

jan001 16. Sep 2013 08:50

AW: TStringGrid in Delphi7 und XE
 
Ohne Instanz ist OK. Das ist nur als Beispiel. Ich brauche aber mit Instanz - Anruf von anderer Unit.

DeddyH 16. Sep 2013 08:59

AW: TStringGrid in Delphi7 und XE
 
Stimmt die Instanz? Ist dort auch die korrekte Zelle markiert? Sollte man nicht lieber Logik und Darstellung trennen?

Daniela.S 16. Sep 2013 09:20

AW: TStringGrid in Delphi7 und XE
 
Zitat:

Ohne Instanz ist OK. Das ist nur als Beispiel. Ich brauche aber mit Instanz - Anruf von anderer Unit.
Unabhängig von dem Problem jetzt... dafür solltest du besser eine Public-Funktion machen, die du dann in der anderen Unit aufrufst. Ansonsten erzeugst du sehr viele Abhängigkeiten.

jan001 16. Sep 2013 09:48

AW: TStringGrid in Delphi7 und XE
 
In richtigem Programm habe ich public function gemacht, aber das Problem bleibt.

Klaus01 16. Sep 2013 10:01

AW: TStringGrid in Delphi7 und XE
 
Delphi-Quellcode:
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;
Woher bekommst Du denn hier die Spalten- und Zeilekoordianten her?
Solltest Du die X,Y Werte nicht in GridKoordinaten umwandeln und dann benutzen?

Grüße
Klaus

jan001 16. Sep 2013 10:07

AW: TStringGrid in Delphi7 und XE
 
Das braucht man nicht.
Es geht nur um Form1.StringGrid1.Cells und StringGrid1.Cells

DeddyH 16. Sep 2013 10:09

AW: TStringGrid in Delphi7 und XE
 
Hast Du meine Nachfragen aus #5 schon geprüft?

jan001 16. Sep 2013 10:20

AW: TStringGrid in Delphi7 und XE
 
Ich habe geprüft. Das gleiche Code ist mit D7 OK in XE5 nicht.

DeddyH 16. Sep 2013 10:22

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.

baumina 16. Sep 2013 10:29

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;

jaenicke 16. Sep 2013 10:47

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.

jan001 16. Sep 2013 11:37

AW: TStringGrid in Delphi7 und XE
 
Hier ist link zu Projekt im D7 und XE5.
http://www.a101.de/test/D7.ZIP
http://www.a101.de/test/XE5.ZIP

baumina 16. Sep 2013 13:04

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.

sx2008 16. Sep 2013 13:15

AW: TStringGrid in Delphi7 und XE
 
Du machst einen ganz bösen Fehler indem du innerhalb der Klasse
Delphi-Quellcode:
TForm1
auf die Instanz
Delphi-Quellcode:
Form1
zugreifst!!!

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:
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;
Da aber self und Form1 auf unterschiedliche Objekte verweisen können, bringt dich die Benüzung von Form1 in Teufels Küche.
Innerhalb einer Klasse anstatt über self auf Form1 zuzugreifen ist ganz eindeutig ein Fehler!

MEissing 16. Sep 2013 13:17

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)

DeddyH 16. Sep 2013 13:35

AW: TStringGrid in Delphi7 und XE
 
Zitat:

Zitat von sx2008 (Beitrag 1228675)
Du machst einen ganz bösen Fehler indem du innerhalb der Klasse
Delphi-Quellcode:
TForm1
auf die Instanz
Delphi-Quellcode:
Form1
zugreifst!!!

Mir scheint, Du hast den Thread nicht von Anfang an gelesen.

jan001 16. Sep 2013 13:45

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.

MEissing 16. Sep 2013 13:50

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 ;-)

sx2008 16. Sep 2013 14:24

AW: TStringGrid in Delphi7 und XE
 
Zitat:

Zitat von DeddyH (Beitrag 1228677)
Zitat:

Zitat von sx2008 (Beitrag 1228675)
Du machst einen ganz bösen Fehler indem du innerhalb der Klasse
Delphi-Quellcode:
TForm1
auf die Instanz
Delphi-Quellcode:
Form1
zugreifst!!!

Mir scheint, Du hast den Thread nicht von Anfang an gelesen.

Der TE hat den Grund gesucht, weshalb Delphi7 und XE unterschiedlich (auf fehlerhaften Code) reagieren, oder?
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.

DeddyH 16. Sep 2013 14:27

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.

jan001 17. Sep 2013 07:55

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 15:33 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