AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Code wird nicht ausgeführt - warum? (erledigt, danke an Popov)
Thema durchsuchen
Ansicht
Themen-Optionen

Code wird nicht ausgeführt - warum? (erledigt, danke an Popov)

Ein Thema von d7user1 · begonnen am 19. Mär 2014 · letzter Beitrag vom 20. Mär 2014
Antwort Antwort
Seite 1 von 3  1 23      
d7user1
(Gast)

n/a Beiträge
 
#1

Code wird nicht ausgeführt - warum? (erledigt, danke an Popov)

  Alt 19. Mär 2014, 18:55
hallo. ich habe momentan ein ganz seltsames problem. so etwas habe ich noch nie erlebt.

ich habe eine form mit einer listview. die items sind mit checkboxen versehen.
parallel gibt es eine stringlist in welcher die selben "werte" zu finden sind.

in einem ListView1MouseUp() ist nun folgende schleife enthalten:
Delphi-Quellcode:
Item := ListView1.GetItemAt(X, Y);
// ...
for i := 0 to WerteListe.Count - 1 do
      begin
       if ItemGefunden(Item, i) then begin
        break;
       end;
      end;
der funktion ItemGefunden wird "i" übergeben und in der funnktion gibt es dann soetwas wie {* ... *}Zeile := WerteListe.Strings[i]; in der weteren ausfhrung wird einfach nur geguckt ob dieser wert "Zeile" ein "_" als erstes zeichen hat oder nicht.
wenn ja, wird es entfernt anderenfalls wird es hinzugefügt:

Delphi-Quellcode:
if WerteListe.Strings[i][1] = '_then
      WerteListe.Strings[i] := Copy(WerteListe.Strings[i], 2, Length(WerteListe.Strings[i]))
     else
      WerteListe.Strings[i] := '_' + WerteListe.Strings[i];
und genau da ist das seltsame problem:

wenn ich alles so belasse wird der code niemals ausgeführt bzw. die liste WerteListe wird niemals geupdatet.
wenn ich aber vor dem if ein showmessage(); setze wird die if-bedingung abgerabritet und die liste WerteListe ändert sich.

aber ohne showmessage() funktioniert es nicht, warum?
ich kann showmessage() auch in ListView1MouseUp() unter die for-schleife packen, dann funktioniert es auch.
aber ohne showmessage() ändert sich nichts.

ich habe schon daran gedacht dass das vielleicht etwas mit dem abarbeten der messages zu tun haben könnte, aber da kenne ich mich nicht aus.

Geändert von d7user1 (19. Mär 2014 um 22:19 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:10
Ich glaube ein Minimalbeispiel dass man bei sich ausführen kann würde die Sache viel einfacher machen.

Spontan hätte ich gesagt dass der Code (natürlich) sehr wohl ausgeführt wird, nur nie grafisch auf der Form dargestellt wird da du an irgendwelchen Strings bastelst ohne dass der Listview etwas davon mitbekommt. Wenn jetzt einmal eine Messagebox drübergelegt wird muss sich der Listview neu zeichnen und tut das dann (mit den aktuellen Strings).
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#3

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:14
ein beispiel kann ich leider nicht anhängen da mein code an vielen ecken und enden mit vielen weiteren dingen verknüpft ist.

es ist lediglich eine stringlist mit ein paar werten und dieselben werte sind in der listview grafisch dargestellt.
checke ich jetzt listview-1 dann sollte in der stringlist eigentlich item-1 ein "_" vorangestellt bekommen. mehr passiert hier nicht.

aber warum so etwas einfaches nicht funktioniert weiß ich nicht.

das schlimme ist dass es bis gestern noch funktioniert hat und jetzt ohne änderungen an der logik funktioniert es nicht mehr.


grob kann man sagen dass die stringlist nicht angerührt wird wenn kein showmessage auftaucht.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:31
Was verstehst du unter "nicht ausgeführt" (sorry für den Fall, dass du es geschrieben hast und ich es übersehen habe)?
  1. Das Programm startet, aber das Ergebnis ist falsch?
  2. Das Programm bricht mit einer Fehlermeldung?
  3. Das Programm startet überhaupt nicht?

//Edit

Wie passt if ItemGefunden(Item, i) then begin in die Funktion? Was macht es da? Item ist vom Typ TListItem. So wie ich das sehen, bewegst du die Maus über ListView und je nachdem von wo du es ausführst, führt es bei jeder Masusbewegung pro Pixel deine Funktion aus? Ist das korrekt?

In dem Codeteil aus der Funktion taucht Item nicht auf.

Geändert von Popov (19. Mär 2014 um 19:39 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:36
ein beispiel kann ich leider nicht anhängen da mein code an vielen ecken und enden mit vielen weiteren dingen verknüpft ist.

es ist lediglich eine stringlist mit ein paar werten und dieselben werte sind in der listview grafisch dargestellt.
Die Situation wie du sie schilderst lässt viel zu viel Raum für Interpretationen und Abweichungen ("Davor dann noch ein if" ...).

Ich weiß nicht, ob ich da auf einem zu hohen Ross sitze. Aber ich finde, man sollte sich die drei Minuten Mühe machen, ein Minimalbeispiel für die Leute, die das Problem finden sollen, zu erstellen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.120 Beiträge
 
Delphi 12 Athens
 
#6

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:41
Zitat:
 WerteListe.Strings[i][1]
Was wird wohl passieren, wenn da mal ein leerer String ('' ) auftaucht?


Wieso baut eigentlich "WertGefunden" den Wert um, wo es doch angeblich nur sucht?
Entweder es gibt noch sowas wie "WertUmschalten", welched danach den Wert ändert,
oder man gibt der "Gefunden"-Funktion einen entsprechenden Namen.


Manchmal fragt man sich, warum keiner auf die blöde Idee kommt den Debugger auszuprobieren.
Und eventuell auch mal die Index- und Bereichsprüfung in den Projektoptionen zu aktivieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Mär 2014 um 19:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:51
Ich rate mal und sage: Ohne ShowMessage wird die ListView einfach nicht neu gezeichnet.... veranlasse doch nach der Änderung ein Neuzeichnen!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.120 Beiträge
 
Delphi 12 Athens
 
#8

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:57
Ich rate mal und sage: Ohne ShowMessage wird die ListView einfach nicht neu gezeichnet.... veranlasse doch nach der Änderung ein Neuzeichnen!
Je nach ListView-Style kommt es drauf an "wie" man das zuweist.

Und Standardmäßig sollte sich die Anzeige von selbst aktualisieren.

Aber
Zitat:
in der funnktion gibt es dann soetwas wie {* ... *}Zeile := WerteListe.Strings[i];
sagt ja sowas von garnichts aus.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#9

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 19:59
Zitat:
Ich rate mal und sage: Ohne ShowMessage wird die ListView einfach nicht neu gezeichnet.... veranlasse doch nach der Änderung ein Neuzeichnen!
ich ändere die listview nicht. ich ändere die dazu parallel erstellte stringlist.

Zitat:
Was wird wohl passieren, wenn da mal ein leerer String ('' ) auftaucht?
das wird nie passieren da es prüfungen gibt die das nicht zulassen.

Zitat:
Wieso baut eigentlich "WertGefunden" den Wert um, wo es doch angeblich nur sucht?
Zitat:
( ... ) in der weteren ausfhrung wird einfach nur geguckt ob dieser wert "Zeile" ein "_" als erstes zeichen hat oder nicht.
wenn ja, wird es entfernt anderenfalls wird es hinzugefügt:

wie kann ich denn mit dem debuggen genau an dieser stelle anfangen?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#10

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 20:07
Wo wir dabei sind, warum über ListView1MouseUp() und ListView1.GetItemAt(X, Y) ?

Da gibt es doch bessere Möglichkeiten, z. B. OnClick oder OnDblClick:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  NewColumn: TListColumn;
  ListItem: TListItem;
begin
  with ListView1 do
  begin
    ViewStyle := vsReport;
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Caption';
    NewColumn.Width := 150;
    for i := 1 to 10 do
    begin
      ListItem := Items.Add;
      ListItem.Caption := 'Caption #' + IntToStr(i);
    end;
  end;
end;

procedure Test(Item: TListItem; i: Integer);
begin
  ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption]));
end;

procedure TForm1.ListView1DblClick(Sender: TObject);
begin
  if not (Sender is TListView) then Exit;

  with TListView(Sender) do
    Test(Selected, 4711);
end;
Und um das zu steigern, warum Werte in einer Parallel-StringList? Warum nicht als Bagage an ListView?
Delphi-Quellcode:
type
  TMeineDaten = class
    Str: String;
    Int: Integer;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  NewColumn: TListColumn;
  ListItem: TListItem;
  MeineDaten: TMeineDaten;
begin
  with ListView1 do
  begin
    ViewStyle := vsReport;
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Caption';
    NewColumn.Width := 150;

    for i := 1 to 10 do
    begin
      MeineDaten := TMeineDaten.Create;
      MeineDaten.Str := '_Abc';
      MeineDaten.Int := 123;

      ListItem := Items.Add;
      ListItem.Caption := 'Caption #' + IntToStr(i);
      ListItem.Data := MeineDaten;
    end;
  end;
end;

procedure Test(Item: TListItem; i: Integer; Daten: TMeineDaten);
begin
  ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption]));

  ShowMessage(Format('Daten aus Bagage: %s und %d', [Daten.Str, Daten.Int]));
end;

procedure TForm1.ListView1DblClick(Sender: TObject);
begin
  if not (Sender is TListView) then Exit;

  with TListView(Sender) do
  begin
    Test(Selected, 4711, TMeineDaten(Selected.Data));
  end;
end;

//WICHTIG: bei löschen, der Items muss das Objekt vorher freigegeben werden!!!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:29 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