Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Sichtbarkeit Werte in StringGridzelle (https://www.delphipraxis.net/216543-sichtbarkeit-werte-stringgridzelle.html)

vesila 14. Jan 2025 23:51

Sichtbarkeit Werte in StringGridzelle
 
Hallo liebe Gemeinschaft,

In einer Anwendung benutze ich ein StringGrid und will die erste Spalte in einer For Schleife von
Zeile 1 bis Zeile 31 mit Werten füllen. Beim Debugger kann ich im Fenster „Überwachte Ausdrücke“ die eingetragenen Werte sehen.
Bei der Vorgehensweise
For i:=1 to 31 do
Begin
StringGrid.cells[0,1]:=IntToString(i);
End;
erscheinen im Debuggerfenster “überwachte Ausdrücken“ alle Werte von 1 bis 31 nur im StringGrid selbst sind sie nicht sichtbar.
Wenn ich die Zeile über die Anweisungen
StringGrid.cells[0,0]:=‘1‘ ,StringGrid.cells[0,1]:=‘2‘ bis StringGrid.cells[0,30]:=‘31‘ fülle sind die Werte sichtbar

In den Options habe ich die Eigenschaften goEditing und goAlwaysShowEditor auf true gesetzt.

Wie ist das Problem der Sichtbarkeit zu lösen.

jaenicke 15. Jan 2025 00:09

AW: Sichtbarkeit Werte in StringGridzelle
 
Zitat:

Zitat von vesila (Beitrag 1545226)
For i:=1 to 31 do
Begin
StringGrid.cells[0,1]:=IntToString(i);
End;

Du schreibst alle Werte der Reihe nach in die gleiche Zelle 0, 1 statt 0, i. (Es sei denn das ist nur ein Tippfehler im Forum, weil du den Code vermutlich nicht 1:1 kopiert hast, denn die Funktion heißt IntToStr nicht IntToString.)

vesila 15. Jan 2025 13:28

AW: Sichtbarkeit Werte in StringGridzelle
 
Danke Sebastian für die Info.

Die falsche Schreibweise von InToString ist ein Übertragungsfehler. Beim Debugger der Anwendungen hätte der Compiler gemeckert.
Das Schreiben der Werte in eine Zelle habe ich bewußt zu Testzwecken gemacht, es ist einfacher den Verlauf im Debuggerfenster "Überwachte Ausdrücke" zu verfolgen.
Dort kann ich sehen, das die Werte wie erwünscht in die Zelle eingetragen werden, nur in der Zelle selber sind sie nicht sichtbar.

Viele Grüße vesila

DeddyH 15. Jan 2025 13:32

AW: Sichtbarkeit Werte in StringGridzelle
 
Delphi-Quellcode:
StringGrid.cells[0,1]
das ist immer dieselbe Zelle, unabhängig davon, welchen Wert i gerade hat.

vesila 15. Jan 2025 15:11

AW: Sichtbarkeit Werte in StringGridzelle
 
Danke DeddyH für die Info.

Das Schreiben der Werte in eine Zelle habe ich bewußt zu Testzwecken gemacht, es ist einfacher den Verlauf im Debuggerfenster "Überwachte Ausdrücke" zu verfolgen.
Dort kann ich sehen, das die Werte wie erwünscht in die Zelle eingetragen werden, nur in der Zelle selber sind sie nicht sichtbar.
Mir geht es um die Sichtbarkeit. Warum sind die eingetragenen Werte nicht in der STringGridzelle sichtbar.

Viele Grüße vesila

QuickAndDirty 15. Jan 2025 15:16

AW: Sichtbarkeit Werte in StringGridzelle
 
Geht das ?(Ich habe es selbst nicht getestet)
Delphi-Quellcode:
Procedure Test;
var
  Grid:tStringGrid;
  aRow, aCol:integer;
Begin
  Grid := tStringGrid.Create(Application.Mainform);
  Grid.parent := Application.Mainform;
  Grid.Align := AlClient;
  Grid.Rowcount := 50;
  Grid.Colcount := 50;
  Grid.Visible := true;
  For aRow := 0 to Grid.Rowcount-1 do
    For aCol := 0 to Grid.Colcount-1 do
      Grid.Cells[aCol,aRow] := inttoStr(aCol)+','+inttostr(aRow);
  Application.Processmessages;
end;

Rolf Frei 15. Jan 2025 15:26

AW: Sichtbarkeit Werte in StringGridzelle
 
Dein Code wird nur in der ersten Zelle (0,1) den Wert "31" anzeigen, sonst nichts. Das ist der letzte Wert deiner FOR Schlaufe, bei der du bei jedem Druchlauf die erste Zelle (0,1) überschreibst. Wie schon geschrieben, müsste es StringGrid.cells[0,i]:=IntToString(i) heissen.

Folgendes funktioniert wie es soll:
Delphi-Quellcode:
var
  i: integer;
begin
  StringGrid1.RowCount := 32; // 32 Zeilen, da du erst ab der 2. abfüllst. Die erste Zeile wäre 0.
  for i := 1 to 31 do  // ab der 2. Zeile werden die folgenden 31 Zeilen der ersten Spalte abgefüllt
  begin
    StringGrid1.cells[0,i]:=IntToStr(i);
  end;
end;

Delphi.Narium 15. Jan 2025 16:16

AW: Sichtbarkeit Werte in StringGridzelle
 
vesila möchte in der Zelle [0,1] den jeweiligen Wert von i sehen. Das da immer in die gleiche Zelle geschrieben wird ist bekann und gewollt, um beim Debuggen dort sehen zu können, ob jeweils der entsprechende Wert erscheint.
Die insgesamt 32 Werte sind beim Debuggen aber ausnahmslos nicht zu sehen. Es müsste aber beobachtet werden können, dass sich der Wert von Zelle [0,1] 32mal ändert. Dem ist aber nicht so. Nur der Wert in den überwachten Ausdrücken ändert sich. Sprich: Bei i = 31 steht in den überwachten Ausdrücken für die Zelle [0,1] der Wert 31. Aber dieser Wert ist im Stringgrid in der Anzeige nicht sichtbar. Es gibt also einen Unterschied zwischen dem überwachten Ausdruck für Zelle [0,1] und der Anzeige im Grid. Die Frage ist: Warum?

Rolf Frei 15. Jan 2025 16:53

AW: Sichtbarkeit Werte in StringGridzelle
 
Sehe das Problem nicht wirklich, da das bei mir problemlos funktioniert, auch wenn ich Cells[0,1] abfülle und abfrage. Da steht bei jedem Durchlauf der Wert von i drin, wie es zu erwarten ist. Der Breakpoint habe ich auf dem "end" der For-Schlaufe und seheh dann jeweils den aktuellen Wert von i in Cell[0,1].

Leider ist sein OP recht unklar und verwirrend. Mir ist auf jeden Fall noch nicht klar was sein Problem denn nun genau ist.

himitsu 15. Jan 2025 16:56

AW: Sichtbarkeit Werte in StringGridzelle
 
Zitat:

Zitat von Rolf Frei (Beitrag 1545247)
Mir ist auf jeden Fall noch nicht klar was sein Problem denn nun genau ist.

Das wurde ja eingentlich schon mehrfach genau erwähnt.

Anstatt in der Schleife die Variable
Delphi-Quellcode:
i
zu nutzen, wurde eine statische
Delphi-Quellcode:
1
verwendet.

Was jetzt so wer daran ist, diesen Fehler bei sich zu beheben .... keine Ahnung, es wurde ja nichts weiter zu gesagt.

Rolf Frei 15. Jan 2025 17:39

AW: Sichtbarkeit Werte in StringGridzelle
 
Ja aber was will er denn nun genua sehen? Die Werte werden doch im Debugger richtig angezeigt. Meint er eventuell visuell in seinem StringGrid während dem Debuggen? Das kann nicht funktionieren, da beim Debuggen die Anwendung pausiert wird/ist und damit auch keine Messages, etc. verarbeiten kann. Zur Anzeige der Werte im Grid müssen diverse Messages verarbeitet werden, Z.B. WM_PAINT, etc. Das geht erst wieder wenn die Anweundung im Messageloop ist oder man Applicaton.ProcessMessages im FOR Loop aufruft.

Folgender Code zeigt nach der Zeile mit ProcessMessages die Zahlen auch visuell im Grid an, da dadurch alle anstehenden Messages verarbeitet werden, die zur Anzeige der Cel-Werte im StringGrid ausgeführt werden müssen.

Delphi-Quellcode:
var
  i: integer;
begin
  StringGrid1.RowCount := 32; // 32 Zeilen, da du erst ab der 2. abfüllst. Die erste Zeile wäre 0.
  for i := 1 to 31 do // ab der 2. Zeile werden die folgenden 31 Zeilen der ersten Spalte abgefüllt
  begin
    StringGrid1.cells[0,i]:=IntToStr(i);
    Application.ProcessMessages; // Nach dieser Zeile wird der Wert im StringGrid angezeigt.
  end;
end;

jaenicke 15. Jan 2025 21:22

AW: Sichtbarkeit Werte in StringGridzelle
 
Falls es nicht nur um die Anzeige während des Debuggens geht (wie in der letzten Antwort vermutet):
Es wäre gut, wenn du das einmal in einer neuen Anwendung ausprobieren würdest. Wenn es da auch nicht geht, häng bitte das Projekt an, damit wir uns das konkret anschauen können.

vesila 15. Jan 2025 21:47

AW: Sichtbarkeit Werte in StringGridzelle
 
Guten Abend liebe Mitstreiter,

vielen Dank für die Hilfen.
Delphi.Narium hat erkannt was ich wissen möchte. Die Werte werden laut Debugger Fenster in die Zelle des StringGrids geschrieben aber sie sind dort
nicht sichtbar. Auch wenn ich die For Schleife ohne Debugger Fenster vollständig durchlaufen lasse ist im StringGrid nur eine weiße Fläche zu sehen.
Die Anweisung Application.ProcessMessages kennt die Anwendung nicht und es tritt ein Laufzeitfehler auf.
Ich denke, ich muss im Objektinspektor des StringGrid ein oder mehrere Eigenschaften ändern, ich weiß nur nicht welche.

Viele Grüße vesila

jaenicke 15. Jan 2025 22:29

AW: Sichtbarkeit Werte in StringGridzelle
 
Zitat:

Zitat von vesila (Beitrag 1545258)
Ich denke, ich muss im Objektinspektor des StringGrid ein oder mehrere Eigenschaften ändern, ich weiß nur nicht welche.

Du musst nur die Anzahl der Zeilen und Spalten setzen, was du ja wohl gemacht hast, denn sonst würdest du ja keine leeren Zellen sehen. Wenn ich eine neue Anwendung erstelle, ein StringGrid draufpacke und diesen Code bei einem Buttonklick ausführe, sind die Zahlen zu sehen. Mehr muss da nicht gesetzt werden.
Delphi-Quellcode:
procedure TForm280.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  StringGrid1.RowCount := 32;
  StringGrid1.ColCount := 1;
  for i := 1 to 31 do
  begin
    StringGrid1.Cells[0, i] := IntToStr(i);
  end;
end;

Jasocul 16. Jan 2025 05:34

AW: Sichtbarkeit Werte in StringGridzelle
 
Dazu fallen mir folgende Fragen ein:
  • Schreibst du ins richtige Stringgrid?
  • Zeichnest du die Felder selbst?
  • Falsche Einstellungen?
Zur ersten Frage:
Arbeitest du mit "with"? In dem Fall könnte vielleicht ein anderes StringGrid angesprochen werden. Gibt es vielleicht ein StringGrid außerhalb des sichtbaren Bereichs, das du versehentlich mit den Werten füllst?
Zur zweiten Frage:
Falls du die Zellen selbst zeichnest (OnDrawCell), könnte dort ein Fehler vorliegen
Zur dritten Frage:
DefaultDrawing sollte True sein (Es sei denn, du zeichnest selbst).
Passen Hintergrund- und Textfarbe zusammen? Falls beides gleich ist, wird man nichts sehen können (Color, FixedColor, Font.Color). Eventuell auch noch ParentColor und ParentFont prüfen.
Ist der DrawingStyle auf gdsClassic? Alle anderen Einstellungen erfordern Anpassungen.

Mehr fällt mir gerade nicht ein.

peterbelow 16. Jan 2025 11:58

AW: Sichtbarkeit Werte in StringGridzelle
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1545246)
vesila möchte in der Zelle [0,1] den jeweiligen Wert von i sehen. Das da immer in die gleiche Zelle geschrieben wird ist bekann und gewollt, um beim Debuggen dort sehen zu können, ob jeweils der entsprechende Wert erscheint.
Die insgesamt 32 Werte sind beim Debuggen aber ausnahmslos nicht zu sehen. Es müsste aber beobachtet werden können, dass sich der Wert von Zelle [0,1] 32mal ändert. Dem ist aber nicht so. Nur der Wert in den überwachten Ausdrücken ändert sich. Sprich: Bei i = 31 steht in den überwachten Ausdrücken für die Zelle [0,1] der Wert 31. Aber dieser Wert ist im Stringgrid in der Anzeige nicht sichtbar. Es gibt also einen Unterschied zwischen dem überwachten Ausdruck für Zelle [0,1] und der Anzeige im Grid. Die Frage ist: Warum?

Ich nehme mal an, dass bei diesem Konstrukt das Grid einfach nicht neu gezeichnet wird da innerhalb der Schleife keine Paint-Messages verarbeitet werden können.

Delphi.Narium 16. Jan 2025 12:14

AW: Sichtbarkeit Werte in StringGridzelle
 
Zitat:

Zitat von himitsu (Beitrag 1545248)
Anstatt in der Schleife die Variable
Delphi-Quellcode:
i
zu nutzen, wurde eine statische
Delphi-Quellcode:
1
verwendet.

Was jetzt so wer daran ist, diesen Fehler bei sich zu beheben .... keine Ahnung, es wurde ja nichts weiter zu gesagt.

Das ist ja eben nicht der Fehler. Der Fehler ist die mangelnde Sichtbarkeit der zugewiesenen Werte in Zelle [0,1].

Und es wird nicht das falsche StringGrid verwendet, da in den überwachten Ausdrücken der korrekte Wert im korrekten Stringgrid zu sehen ist.

Und da es sich (laut Profil) um Delphi 6 handelt, tendiert die Wahrscheinlichkeit, dass das Problem von irgendwem nachgestellt werden kann (leider) gegen Null.

Ich möchte mal nicht ausschließen, dass das StringGrid erst nach Beendigung der Routine mit all seinen "neuen" Inhalten neu gezeichnet wird und deshalb die Werte erst nach Abschluss der Routine sichtbar werden und noch nicht, wenn in der Routine im Debugger an einem Breakpoint gehalten wird.

Habe mal 'ne KI befragt, demnach gibt es in Delphi 6 beim Neuzeichnen eines StringGrid einen Bug, der genau dieses Problem verursachen könnte. Eine kleine Abwandlung der Routine könnte eventuelle hilfreich sein:
Delphi-Quellcode:
For i := 1 to 31 do
Begin
  StringGrid.cells[0,1] := IntToStr(i);
  StringGrid.Invalidate;
End; // hier den Breakpoint setzen.
Zitat:

Zitat von peterbelow (Beitrag 1545273)
Ich nehme mal an, dass bei diesem Konstrukt das Grid einfach nicht neu gezeichnet wird da innerhalb der Schleife keine Paint-Messages verarbeitet werden können.

Ja, genau das ist das Problem.

In der gegebenen Routine wird das StringGrid in Delphi 6 nicht automatisch neu gezeichnet, sodass die Werte nicht sofort sichtbar werden. Das liegt daran, dass Delphi aus Performancegründen nicht nach jeder Änderung ein Neuzeichnen auslöst

QuickAndDirty 17. Jan 2025 13:58

AW: Sichtbarkeit Werte in StringGridzelle
 
Zitat:

Zitat von vesila (Beitrag 1545258)
Ich denke, ich muss im Objektinspektor des StringGrid ein oder mehrere Eigenschaften ändern, ich weiß nur nicht welche.

1. Grid Anklicken
2. Strg+c
3. Notepad.exe öffnen
4. Strg+v

Das sollte die DFM Einstellungen des gitters wiedergben.

Die Sache ist die , das man eigentlich nichts über ein Projekt sagen kann über das wir nichts wissen!!!

Die Funktion Application.Processmessages kommt in der Unit "Forms" vor. Also wenn das Grid da auf dem Formular liegt sollte das gehen.
Wenn du Application.Processmessages nicht kennst, muss ich annehmen dass du in jemand anderen sein Code etwas versuchst zu verstehen. Ist das so?

Sobald du in Delphi im Debugger bist wird die Oberfläche des Programms nicht mehr durchgehend gerendered und du kannst dann halt auch nichts anzeigen lassen, Das ist nicht so wie im Browser, wo du den HTML code einfach aktualisieren kannst und der wird unabhängig vom Programm ablauf direkt angezeigt.

QuickAndDirty 17. Jan 2025 14:04

AW: Sichtbarkeit Werte in StringGridzelle
 
Zitat:

Zitat von peterbelow (Beitrag 1545273)
Ich nehme mal an, dass bei diesem Konstrukt das Grid einfach nicht neu gezeichnet wird da innerhalb der Schleife keine Paint-Messages verarbeitet werden können.

Und während der Debugger an ist auch nicht!

vesila 17. Jan 2025 18:44

AW: Sichtbarkeit Werte in StringGridzelle
 
Guten Abend liebe Mitstreiter,

dank eurer Unterstützung habe ich eine oder die Lösung gefunden.
Ich war davon ausgegangen, das das StringGrid wie eine Exceltabelle funktioniert. Die eingetragenen Werte sind immer sichtbar. Werden die Werte händisch eingetragen, verhält sich das Grid auch so. Werden die Werte jedoch per Programm eingetragen, ist nichts zu sehen bis man die Repaint Methode aufruft, dann sind die Werte zu sehen. Dabei ist es egal ob die Methode in jedem Schleifendurchlauf aufgerufen wird oder nach der Schleife.

Nochmals vielen Dank und ein schönes Wochenende.

Viele Grüße
vesila

jaenicke 17. Jan 2025 19:27

AW: Sichtbarkeit Werte in StringGridzelle
 
Welche Delphiversion nutzt du denn? Stimmt das Delphi 6? In aktuellen Delphiversionen ist das definitiv nicht so.

vesila 18. Jan 2025 13:16

AW: Sichtbarkeit Werte in StringGridzelle
 
Hallo Sebastian,

ich nutze die Version Delphi 6.

VG vesila


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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