Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi OnTime Exepction ? (https://www.delphipraxis.net/89553-ontime-exepction.html)

nitschchedu 2. Apr 2007 10:49


OnTime Exepction ?
 
Hallo alle,
also habe ne Bösses Problem ich habe ne OnTime und wenn das ausgeführt wird will ich
in einen ListView was auslesen.

Delphi-Quellcode:
ID := ListView1.Items[Pos].SubItems[14];
doch es gibt da immer eine Exepction :wall: !!!

Mit ne Button --> ButtonClick geht diese Zeile warum aber im OnTime nicht ? :gruebel:

Gruber_Hans_12345 2. Apr 2007 10:51

Re: OnTime Exepction ?
 
welche exception?
was ist pos, wo und auf was wird das gesetzt?

nitschchedu 2. Apr 2007 10:58

Re: OnTime Exepction ?
 
Also Pos ist ne Integer und beim aufruf der Funktion 0 also ich will damit den 1 Eintrag aus meinen ListView.
Die Exception "Zugrief auf Adressspeicher Sowieso blabla bla (eben eine Adresse)". Was man eben von Windows kennt.

Gruber_Hans_12345 2. Apr 2007 11:01

Re: OnTime Exepction ?
 
dann greifst du wohl auf eine postion zu, die nicht definiert ist, und deshalb gibts die AV

entweder ist Pos nicht innerhalb deiner Liste, oder der SubItem Index mit 14 ist zu hoch (zb. du hast keine 15 subelemente)

aber ohne mehr code kann man natürlich nur munter drauf los raten

Luckie 2. Apr 2007 11:03

Re: OnTime Exepction ?
 
Zitat:

Zitat von nitschchedu
Die Exception "Zugrief auf Adressspeicher Sowieso blabla bla (eben eine Adresse)". Was man eben von Windows kennt.

Was hat dein Fehler mit Windows zu tun? Der Fehler kommt nicht von Windows, sondern von deinem fehlerhaft programmierten Programm.

nitschchedu 2. Apr 2007 11:11

Re: OnTime Exepction ?
 
Das war ne vergleich :wink: !

Soweit wie ich das gezählt habe sind das 15 :gruebel: .

Delphi-Quellcode:
  var
   tpcolumn: TListColumn;
  begin

  ....

  ListView1.RowSelect:= TRUE;
  ListView1.MultiSelect:= TRUE;
  ListView1.showcolumnheaders := TRUE;
  ListView1.ReadOnly := TRUE;
  ListView1.ViewStyle := vsReport;

  ListView1.IconOptions.Arrangement := iaTop;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := 'Haupt ';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '1';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '2';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '3';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '4';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '5';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '6';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '7';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '8';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '9';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '10';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '11';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '12';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '13';
  tpcolumn.width := 40;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '14';
  tpcolumn.width := 60;

  tpcolumn := ListView1.Columns.Add;
  tpcolumn.Caption := '15';
  tpcolumn.width := 60;

  ....

So und damit kein Fusch passiert kommt noch vor der abfrage
Delphi-Quellcode:
  if ListView1.Items.Count = 0 then
  begin
     ShowMessage('Bitte erstmal was in die Liste eintragen!');
     Exit;
  end;
Und da ich den Eintrag sehe und er da vorbeikommt wundert mich das, das er da Abschmiert :gruebel: .

Gruber_Hans_12345 2. Apr 2007 11:12

Re: OnTime Exepction ?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von nitschchedu
Die Exception "Zugrief auf Adressspeicher Sowieso blabla bla (eben eine Adresse)". Was man eben von Windows kennt.

Was hat dein Fehler mit Windows zu tun? Der Fehler kommt nicht von Windows, sondern von deinem fehlerhaft programmierten Programm.

Na klar ist windows schuld, wenn windows nicht so böse wäre und den speicher von den anderen programmen schützen würde, dann würde diese AV ja auch nicht kommen ;)

Gruber_Hans_12345 2. Apr 2007 11:15

Re: OnTime Exepction ?
 
dann zeig noch den code her, wo du das machst ID := ListView1.Items[Pos].SubItems[14]; (also das drüber)

[edit]bzw. kontrolliere, das pos auch wirklich im bereich ist

nitschchedu 2. Apr 2007 11:21

Re: OnTime Exepction ?
 
Erstmal Windows ist doch immer Schuld :tongue: .

Ok hier so sieht das ganze aus.

Delphi-Quellcode:
procedure TfrmBot.Timer1Timer(Sender: TObject);
var
  ID: String;
  Href: String;
begin
  Timer1.Enabled := False;

  if LoginStatus then
  begin
     
    ID := ListView1.Items[Pos].SubItems[14];
    Href := Form1.WebBrowser1.OleObject.
      Document.Frames.item('main').
      Document.location.href;

     if Href <>
      'http://www.google.de/search.php?id=' +
       ID + '&suche=place' then
     begin
       exit;
     end;


     Form1.WebBrowser1.OleObject.Document.Frames.item('main').
      Document.Forms.item('units').Elements.item('x').value
      := ListView1.Items[Pos].Caption;
     Form1.WebBrowser1.OleObject.Document.Frames.item('main').
      Document.Forms.item('units').Elements.item('y').value
      := ListView1.Items[Pos].SubItems[0];
   end;

end;
:duck:

Gruber_Hans_12345 2. Apr 2007 11:39

Re: OnTime Exepction ?
 
und WO wird pos auf einen wert gesetzt?

Klaus01 2. Apr 2007 11:40

Re: OnTime Exepction ?
 
Hallo,

pos ist bei Dir eine globale Variable?
Wo setzt Du diese?

Delphi-Quellcode:
if LoginStatus then
  begin
    if pos >= 0 and pos <= ListView.Items.count -1 then // <- neu
      begin
        ID := ListView1.Items[Pos].SubItems[14];
        Href := Form1.WebBrowser1.OleObject.
    ....
Grüße
Klaus

nitschchedu 2. Apr 2007 13:01

Re: OnTime Exepction ?
 
Also das sind 3 Sachen:

1: Ich drücke den Button

Delphi-Quellcode:
procedure TfrmBot.Button2Click(Sender: TObject);
var
   ID: String;
begin
  [u]Pos := 0;[/u]

  if ListView1.Items.Count = 0 then
  begin
     ShowMessage('Bitte erstmal was in die Liste eintragen!');
     Exit;
  end;

  ID := ListView1.Items[Pos].SubItems[14];

  Form1.WebBrowser1.Navigate(http://www.google.de/search.php?id=' + 
       ID + '&suche=place');
end;
So das "Form1.WebBrowser1.Navigate(http://www.google.de/search.php?id=' +
ID + '&suche=place');" ruft eine Seite auf.

2: Nun warte ich bis die Seite Fertig ist.

Delphi-Quellcode:
procedure TfrmBot.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  Form1.Edit1.Text := URL;
  Form1.StatusBar1.SimpleText := URL+' erfolgreich geladen';
  Timer1.Enabled := True;
end;
Mit "Timer1.Enabled := True;" Schalte ich es an (Da noch Frames mit geladen werden Warte ich 3 Sekunden).

3: Siehe oben das OnTime.

Gruber_Hans_12345 2. Apr 2007 13:05

Re: OnTime Exepction ?
 
ok, und wo trägst du das element in die liste ein?

ich glaube es reicht nicht aus, das du die 15 spalten anlegst, du mußt diese auch bei jedem Element befüllen.

nitschchedu 2. Apr 2007 13:22

Re: OnTime Exepction ?
 
Also so langsam haben wir fast den ganzen Quellcode :zwinker: .

Delphi-Quellcode:
procedure TfrmBot.btAddClick(Sender: TObject);
var
 ListItem: TListItem;
begin
  ListItem := ListView1.Items.Add;
  ListItem.Caption := edR.Text;
  ListItem.SubItems.Add(ed1.Text);
  ListItem.SubItems.Add(ed2.Text);
  ListItem.SubItems.Add(ed3.Text);
  ListItem.SubItems.Add(ed4.Text);
  ListItem.SubItems.Add(ed5.Text);
  ListItem.SubItems.Add(ed6.Text);
  ListItem.SubItems.Add(ed7.Text);
  ListItem.SubItems.Add(ed8.Text);
  ListItem.SubItems.Add(ed9.Text);
  ListItem.SubItems.Add(ed10.Text);
  ListItem.SubItems.Add(ed11.Text);
  ListItem.SubItems.Add(ed12.Text);
  ListItem.SubItems.Add(ed13.Text);
  ListItem.SubItems.Add(ed14.Text);
  ListItem.SubItems.Add(ed15.Text);
end;
Ich muss dazu noch sagen das dieser Effekt nur im OnTime oder im WebBrowser1DocumentComplete, so wie ich das jetzt festgestellt habe.

Gruber_Hans_12345 2. Apr 2007 13:28

Re: OnTime Exepction ?
 
ich vermute mal, du überschreibst dir noch irgendwo die pos, kann es sein, das du pos noch in einem andrem stückchen code verwendest?

(und ich würde auch einen anderen variablen namen verwenden, pos ist immerhin eine delphi funktion)

Luckie 2. Apr 2007 13:33

Re: OnTime Exepction ?
 
Der Variablenname pos ist sowieso ungünstig, da es eine gleichnamige Funktion in der Unit SysUtils gibt.

nitschchedu 2. Apr 2007 13:37

Re: OnTime Exepction ?
 
Später wollte ich es noch hochzählen. Habe die Variabel mal unbenannt in lePos. Aber immer noch der Fehler.

Gruber_Hans_12345 2. Apr 2007 13:44

Re: OnTime Exepction ?
 
bist du 100% sicher, das du diese variable sonst niergends veränderst?

Kontrolliere es nochmal mit dem Debugger, das lePos sicher auf 0 steht, wenn der Timer augelöst wird.

ansonsten poste einfach mal den gesamten code, der fehler müsste in einem noch nicht geposteten stückchen code liegen.

nitschchedu 2. Apr 2007 14:03

Re: OnTime Exepction ?
 
Habe das hier gepostet da ich beim Debugen nichts gefunden habe. Der wert ist 0 wenn ich an die Stelle komme.

Und wenn ich
Delphi-Quellcode:
ListView1.Items[0].SubItems[14];
das mache schmiert er auch ab. Kann es sein das ich keinen zugrief auf ListView habe ?

Gruber_Hans_12345 2. Apr 2007 14:14

Re: OnTime Exepction ?
 
dann gib dir einfach mal die zwei werte manuell aus ... (kurz vor der zeile wo er die AV reißt)

Delphi-Quellcode:
ShowMessage('Items.Count : '+IntToStr(ListView1.Items.Count));
ShowMessage('SubItems.Count : 'IntToStr(ListView1.Items[0].SubItems.Count));

nitschchedu 2. Apr 2007 14:26

Re: OnTime Exepction ?
 
Das erste ist 0, wie kann das sein ? wenn ich auf den Button drücke ist es 1 ! Was geht da ab ?

Gruber_Hans_12345 2. Apr 2007 14:38

Re: OnTime Exepction ?
 
entweder löscht du dir irgendwo die listview
oder du hast eventuell 2 mal eine lsitview? erzeugst du die listview im code? und hast noch mal eine am formular drauf?

aber wie gesagt, ohne source kann man lustig drauf los raten ... ist wie bei lotto spielen

OG Karotte 2. Apr 2007 14:45

Re: OnTime Exepction ?
 
Wann wird denn "btAddClick" aufgerufen???

So wie es aussieht muß doch erstmal dieses Ereignis ausgeführt werden, damit irgendwelche Daten in Deinem Listview erscheinen.

:gruebel: Und nun bin ich mir nicht sicher:
Ist der Inhalt des Listview überhaupt noch gültig nachdem die Routine "btAddClick" verlassen wurde (TListItem ist doch dort lokal, oder?) ? :gruebel:

Gruber_Hans_12345 2. Apr 2007 14:54

Re: OnTime Exepction ?
 
Zitat:

Zitat von OG Karotte
Wann wird denn "btAddClick" aufgerufen???

So wie es aussieht muß doch erstmal dieses Ereignis ausgeführt werden, damit irgendwelche Daten in Deinem Listview erscheinen.

:gruebel: Und nun bin ich mir nicht sicher:
Ist der Inhalt des Listview überhaupt noch gültig nachdem die Routine "btAddClick" verlassen wurde (TListItem ist doch dort lokal, oder?) ? :gruebel:

nein glaub ich nicht, ListItem ist zwar lokal, aber listview ist global.

und ich glaub ohne den Click auf btAdd, kann er auch der Timer nicht aufgerufen werden ... aber ist etwas undurchsichtig bis jetzt

nitschchedu 2. Apr 2007 15:06

Re: OnTime Exepction ?
 
Das ListView habe ich auf das Formular gezogen also ein ganz normales.
Und das mit dem Timer ist richtig 100 Punkte.
Was soll ich den alles Posten damit du es nachvollziehen kannst ?

Gruber_Hans_12345 2. Apr 2007 15:10

Re: OnTime Exepction ?
 
kannst mal alles posten? ansonsten häng mal die pas hier dran ...

nitschchedu 2. Apr 2007 15:26

Re: OnTime Exepction ?
 
Verdammt ich habs gefunden ! "Gruber_Hans_12345" mein Freunddu hattest recht mit deiner Theorier, das es das Listview 2 mal gibt.

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TfrmWorker, frmWorker); <---
  Application.Run;
end.
Das ist von Delphi.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.Navigate('www.google.de');
  frmWorker := TfrmWorker.Create(nil);
  frmWorker.Show;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  frmWorker.Close;
end;
Und Das von mir.

Mit anderen Worten das Formular gibt es 2 mal und also auch das ListView.
Daraus entstand der Speichermatsch so das ich mal in den einen und mal in den anderen war.
Danke Leute für die Hilfe. :mrgreen:


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