AGB  ·  Datenschutz  ·  Impressum  







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

Stringgrid zeichnet zum falschen Zeitpunkt

Ein Thema von Wolli-Essen · begonnen am 24. Feb 2012 · letzter Beitrag vom 29. Feb 2012
Antwort Antwort
Seite 1 von 2  1 2      
Wolli-Essen

Registriert seit: 5. Feb 2010
9 Beiträge
 
#1

Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 13:13
Hallo,

ich habe folgendes problem:


Nach Eingabe in einem Memofeld wird nach Eingabe von Enter über das FormKeyPress Ereignis in einem bestehenden Stringgrid eine Zeile angefügt und mit Cells() beschrieben.
Die neue Zeile wird aber nicht direkt auf dem Bildschirm angezeigt. Erst nachdem ich wieder etwas in das Memofeld eingebe und Enter drücke, wird der vorherige Zeileneintrag angezeigt.

Weiss jemand Rat?

Wolle
  Mit Zitat antworten Zitat
Steku

Registriert seit: 12. Mai 2008
185 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 13:19
Nur so eine idee, kann es gerade nicht prüfen, aber
gibt es nicht irgend etwas wie z.B. ein

.refresh
.update
.repaint
.invalidate

oder so?

Gruß
steku

Geändert von Steku (24. Feb 2012 um 13:21 Uhr)
  Mit Zitat antworten Zitat
Wolli-Essen

Registriert seit: 5. Feb 2010
9 Beiträge
 
#3

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 13:26
Hab ich auch dran gedacht, .refresh etc. ohne Erfolg probiert.

Gruß

Wolle
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 14:39
Erst nachdem ich wieder etwas in das Memofeld eingebe und Enter drücke, wird der vorherige Zeileneintrag angezeigt.
Wie oft muß man es noch erwähnen: Hier hat's keine Hellseher. Wie soll es uns im Forum gelingen, die Ursache ohne deinen Code herauszufinden, wenn dir das nicht einmal mit Code gelingt?
  Mit Zitat antworten Zitat
Wolli-Essen

Registriert seit: 5. Feb 2010
9 Beiträge
 
#5

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 15:48
Ok, versuchen wir es mit etwas Code.

Hier die Ereignisroutine vom Memo KeyPress

Delphi-Quellcode:
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9','a'..'z','/','-', DecimalSeparator, ThousandSeparator])
 then Key := #0;
end;
und hier der entsprechende teil vom FormKeyPress

Delphi-Quellcode:
    While i < GrdArtikel.RowCount-1 do
     Begin
      Artikel := GrdArtikel.Cells[5,i];
      While not datamodule2.DBSRabatt.Eof do
       Begin
        If Datamodule2.DBSRabatt.FieldValues['Gruppe'] = Artikel then
        Begin
         ClubRabatt := ClubRabatt+(StrToFloat(GrdArtikel.cells[4,i])*Datamodule2.DBSRabatt.FieldValues['Rabatt']/100);
         Inc(i);
        End;
        Datamodule2.DBSRabatt.Next;
       End;
     Inc(I);
     End;
     Mtg_Flag := 'J';
     If ClubRabatt > 0 Then
     Begin;
      Clubrabatt := Clubrabatt*-1;
      Summe := Summe+Clubrabatt;
      lb_Summe.Caption := FloatToStrF(Summe,ffNumber,8,2);
      GrdArtikel.RowCount := Zeile;
      GrdArtikel.Cells[0,Zeile] := '1';
      GrdArtikel.Cells[1,Zeile] := 'Clubrabatt';
      GrdArtikel.Cells[3,Zeile] := FloatToStrf(Clubrabatt,ffNumber,8,2);
      GrdArtikel.Cells[4,Zeile] := FloatToStrf(Clubrabatt,ffNumber,8,2);
      GrdArtikel.Cells[5,Zeile] := '1111';
      Inc(Zeile);
     End;
     Memo1.Text := '';
   End;
   ShowMessage('Clubmitglied '+ Datamodule2.DBMitglieder.FieldByName('Vorname')
    .Value+' '+Datamodule2.DBMitglieder.FieldByName('Name').Value+#13+Datamodule2.
    DBMitglieder.FieldByName('Produkt').Value);
  End;

das ShowMessage() wird ausgelöst.

Jetzt kommen noch einige Routinen zum Bezahlvorgang. Nach erfolgter Zahlung wartet das Prg in dieser

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
LblFirma.Caption := TimeToStr(Time);
end;
Schleife.

Erst wenn der nächste Artikel im Memo eingegeben und Enter gedrückt wird, wird die Stringgridzeile der Vorartikels ausgegeben.

Gruß

Wolle
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 16:06
Ok, versuchen wir es mit etwas Code.
GrdArtikel.RowCount := Zeile;
Woher bekommt die Variable Zeile ihren Ursprungswert, sprich: wo wird Zeile initialisiert?
Der von dir eingestellte Code läßt es nicht ohne weiteres zu, den genannten Fehler zu finden.
Ich würde hier erstmal mit einer lokalen Variable Zeile arbeiten, damit du sicherstellst, daß auch wirklich eine Zeile hinzugefügt wurde, falls du woanders mit der Zählung durcheinandergeraten bist:
Delphi-Quellcode:
GrdArtikel.Rowcount := GrdArtikel.Rowcount + 1.
Zeile := GrdArtikel.Rowcount -1; //Zählung beginnt bei 0
Und wieso dieses umständliche Konstrukt?
Delphi-Quellcode:
Clubrabatt := Clubrabatt*-1;
Summe := Summe+Clubrabatt;
statt einfach:
Summe := Summe - Clubrabatt; ???

Übrigens solltest du nicht mit Leerzeichen geizen, dein Code dadurch wird übersichtlicher.

Empfehlung: Debugge einmal deinen Code, indem du auf GrdArtikel.RowCount := Zeile; einen Haltepunkt setzt. Schau dir im Debug-Fenster den Wert von Rowcount und von Zeile an. Vermutlich kommt dein Fehler daher, daß du die Zeile, in die du zuvor reinschreibst, erst später erzeugst. Müßte eigentlich einen Zugriffsfehler ergeben.
  Mit Zitat antworten Zitat
Wolli-Essen

Registriert seit: 5. Feb 2010
9 Beiträge
 
#7

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 16:47
Zitat:
Woher bekommt die Variable Zeile ihren Ursprungswert, sprich: wo wird Zeile initialisiert?
Die Variable Zeile wird im Public Teil deklariert und nach jeder efolgreichen Artikeleingabe erhöht.



Zitat:
Und wieso dieses umständliche Konstrukt?

Delphi-Quellcode:

Clubrabatt := Clubrabatt*-1;
Summe := Summe+Clubrabatt;
statt einfach:
Summe := Summe - Clubrabatt; ???
Der Clubrabatt wird noch als Negativwert gebraucht.

Ich habe einen Haltepunkt bei GrdArtikel.RowCount := Zeile; gemacht.
Row und Zeile haben den korrekten Wert (Also die Zeile, in der der Wert geschrieben werden soll).

Wann kommt es denn vor, das ein Cells[] nicht sofort sichtbar wird?

gruß
Wolle
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 16:57
Zitat:
Woher bekommt die Variable Zeile ihren Ursprungswert, sprich: wo wird Zeile initialisiert?
Die Variable Zeile wird im Public Teil deklariert und nach jeder efolgreichen Artikeleingabe erhöht.
Und das muß man dir alles erst aus der Nase ziehen? Du brauchst keine globale Variable Zeile, der Wert von Zeile steht gewissermaßen bereits in RowCount.

Zitat:
Und wieso dieses umständliche Konstrukt?

Der Clubrabatt wird noch als Negativwert gebraucht.
Dann setz ihn doch dort negativ, wo du ihn negativ brauchst. Das ist übersichtlicher.

Ich habe einen Haltepunkt bei GrdArtikel.RowCount := Zeile; gemacht.
Row und Zeile haben den korrekten Wert (Also die Zeile, in der der Wert geschrieben werden soll).
Wann kommt es denn vor, das ein Cells[] nicht sofort sichtbar wird?
Das ist jetzt aber mal 'ne Frage: in deinem Code ganz offensichtlich! Aber da ja alles korrekt zu sein scheint in deinem Programm und du auch nicht bereit bist, über Verbesserungsvorschläge nachzudenken bzw. dieselben anzuwenden, kann ich dir nun auch nicht mehr weiterhelfen - frag jemand anderen.
  Mit Zitat antworten Zitat
Wolli-Essen

Registriert seit: 5. Feb 2010
9 Beiträge
 
#9

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 17:52
Zitat:
Aber da ja alles korrekt zu sein scheint in deinem Programm und du auch nicht bereit bist, über Verbesserungsvorschläge nachzudenken bzw. dieselben anzuwenden, kann ich dir nun auch nicht mehr weiterhelfen - frag jemand anderen.
Was heisst ich geh auf Verbesserungsvorschläge nicht ein? Du hast doch erst jetzt gesagt wie ich das machen kann. Vorher hast ja nur gefragt warum ich was mache.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

AW: Stringgrid zeichnet zum falschen Zeitpunkt

  Alt 24. Feb 2012, 19:01
Was heisst ich geh auf Verbesserungsvorschläge nicht ein? Du hast doch erst jetzt gesagt wie ich das machen kann. Vorher hast ja nur gefragt warum ich was mache.
Ja, da sieht man, daß du die Beiträge der User, die dir zu helfen versuchen, gar nicht richtig liest. Ich gab dir nämlich bereits davor diesen Rat:

Ich würde hier erstmal mit einer lokalen Variable Zeile arbeiten, damit du sicherstellst, daß auch wirklich eine Zeile hinzugefügt wurde, falls du woanders mit der Zählung durcheinandergeraten bist:
Delphi-Quellcode:
GrdArtikel.Rowcount := GrdArtikel.Rowcount + 1.
Zeile := GrdArtikel.Rowcount -1; //Zählung beginnt bei 0
Darauf bist du nicht eingegangen. Und ich hab nun wirklich keine Lust mehr. Frag einen anderen ...
  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:00 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