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
Benutzerbild von nachti1505
nachti1505

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

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
44.580 Beiträge
 
Delphi 12 Athens
 
#2

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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#3

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
 
#4

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 20:13
wie kann ich denn mit dem debuggen genau an dieser stelle anfangen?
Eie Möglichkeit: in der Funktion am Anfang ein Haltezeichen setzten und dann (oder schon vorher) im Menü Ansicht>Debug-Fenster>Lokale Variablen wählen und Programm starten. Du bekommst ein Fenster mit aktuellen lokalen Werten. Mit der Funktionstaste F7 kannst du dann Zeile für Zeile weiter gehen.

PS: wenn da steht "auf Daten können wegen der Optimierung nicht zugegriffen werden", dann ist die Variable entweder unwichtig und oder bereits wieder entfernt, aber auf jeden Fall wegoptimiert.

Geändert von Popov (19. Mär 2014 um 20:16 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

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
d7user1
(Gast)

n/a Beiträge
 
#6

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 20:19
Zitat:
Wo wir dabei sind, warum über ListView1MouseUp() und ListView1.GetItemAt(X, Y) ?
das mache ich so weil ich in der listview auf eine CheckBox klicke und der code nur ausgeführt werden soll wenn ich diese eben klicke.

ich habe dein beispiel mit OnClick mal ausprobiert und es funktioniert. mein code macht nichts anderes aber es funktioniert nicht.

ich glaube das liegt daran dass ich mich im OnMouseUp-Event befinde. aber wenn ich tatsächlich auf OnClick umsteige, wie komme ich an den klick auf die checkbox dran?

---

ich habe das jetzt mal geändert:
es wird nicht mehr geprüft ob ich auf eine checkbox klicke und und und.
sobald ich das fenster mit der listview bestätige um den prozess danach zu starten rufe ich folgendes auf:
Delphi-Quellcode:
 for i := 0 to WerteListe.Count - 1 do
  begin
   for j := 0 to ListView1.Items.Count - 1 do
    begin
     if (not ListView1.Items[j].Checked) and ItemGefunden(ListView1.Items[j], i) then
      begin
       break;
      end;
    end;
  end;
selbst bei einer sortierten liste nach klick auf eine column wird so genau der string aus der stringlist entfernt welcher in der listview nicht checked ist.

aber warum das nicht in OnMouseUp nicht funktioniert sondern nur mit showmessage ist mir ein großes rätsel.

Geändert von d7user1 (19. Mär 2014 um 20:24 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 20:30
Delphi-Quellcode:
procedure Test(Item: TListItem; i: Integer; Daten: TMeineDaten);
const
  Schwadawum: array[Boolean] of String = ('nicht gesetzt.', 'gesetzt');
begin
  //ShowMessage(Format('i ist: %d; Caption: %s', [i, Item.Caption]));

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

  ShowMessage(Format('Die Checkbox ist %s', [Schwadawum[Item.Checked]]));
end;
EDIT:

Delphi-Quellcode:
   for j := 0 to ListView1.Items.Count - 1 do
    begin
     if (not ListView1.Items[j].Checked) and ItemGefunden(ListView1.Items[j], i) then
Warum gehst du alle Items durch. Du hast doch das eine Item, das du angeklickt hast, doch geschickt. Du mußt nur das abfragen.

Geändert von Popov (19. Mär 2014 um 20:32 Uhr)
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#8

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 20:34
es tut mir leid dass ich kein beispiel posten wollte und das was ich gepostet habe schwachsinn zu sein scheint.

ich werde mich mal einlesen ob bei OnMouseUp irgendwelchen speziellen messages gepostet werden und ob da was geblockt hat.

nur noch eine sache zur bagage:
die daten liegen in einer externen stringlist da ich diese stringlist noch an anderer stelle sehr häufig brauche.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 20:43
Doppelte Pflege ist niemals gut.

NACHTRAG:

OnMouseUp ist für das was du vorhast nicht das optimale Ereignis, es gibt bessere. GetItemAt bietet zwar die Möglichkeit, aber dafür ist es nicht gedacht. Wenn dir ein OnDblClick nicht passt, es gibt noch OnClick. Wie gesagt, das ListItem auf das du geklickt hast kannst du auch über Selected ermitteln, statt mit GetItemAt. Das eine sagt welches ListItem aktuell ausgewählt ist (bei MultiSelected = False, sonst ist es das Erste), das andere über welchem ListItem sich gerade die Maus befindet.

Guck dir mal die Ereignisse mal der Reihe mal durch.

Geändert von Popov (19. Mär 2014 um 21:07 Uhr)
  Mit Zitat antworten Zitat
d7user1
(Gast)

n/a Beiträge
 
#10

AW: Code wird nicht ausgeführt - warum?

  Alt 19. Mär 2014, 20:57
Warum gehst du alle Items durch. Du hast doch das eine Item, das du angeklickt hast, doch geschickt. Du mußt nur das abfragen. diese for-schleife befindet sich in einem ButtonOnClick. ich frage ganz zum schluss ab welche items checked sind und welche nicht.

zur bagage nochmal:
kann es sein dass ich mir diese doppelte for-schleife zum finden eines items und dem passendem stringlist-eintrag mit dem bagage sparen kann da die daten direkt am item hängen?
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:16 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