Entwickler-Ecke

Internet / Netzwerk - IDHTTP Problem adresse aus edit feld lesen


Petros - Di 24.05.11 02:17
Titel: IDHTTP Problem adresse aus edit feld lesen
Hi Delphianer ich habe mal wieder ein problem und weiß keinen lösungsweg und suche hat mir nix ergeben..


Delphi-Quelltext
1:
2:
  
L1.Caption  := IdHttp1.Get(Form2.Edit1.Text); der text inhalt wird aus einer ini datei geladen


Folgenes ich speicher informationen in einer ini datei, in der ini ist eine adresse enthalten die bei jedem start in ein edit.text übergeben wird, diese wiederrum liest informationen von meinem server und gibt diese dann an einem Label weiter. Natürlich könnte ich diese adresse auch direckt über IDHTTP abrufen aber da sich die text datei wo idhttp seine informationen her abruft sich alle 2 tage ändert dachte ich mir das ich dann per edit feld dort die adresse eintrage und nach belieben dann verändern kann. Nun kommt mein problem ich bekomme wenn ich das programm starte immer die meldung

"Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 005FD919 in module 'project1.exe'. Read of address 000002F8'. Process stopped. Use Step or Run to continue."

PS. bevor jetzt jemand irgendwas wegen sicherheit sagt die datei die abgerufen werden soll ist eine log.txt datei von meinem chat

Ich hoffe es war etwas verständlich und mir kann geholfen werden..

MFG Petros


jaenicke - Di 24.05.11 04:23

Prinzipiell ist der Quelltext schon richtig. Das hier sieht aber schon einmal höchst verdächtig aus:
user profile iconPetros hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
  
L1.Caption  := IdHttp1.Get(Form2.Edit1.Text); der text inhalt wird aus einer ini datei geladen
Bist du sicher, dass das die richtige Instanz des Formulars ist? Was sagt denn der Debugger? Ist da vielleicht etwas nil? Und wo genau kommt die Exception? Auch, wenn du im Debugger auf das Editfeld zugreifst?

Sonst fehlt halt ein wenig mehr Quelltext, diese Zeile für sich allein ist korrekt...


colaka - Di 24.05.11 06:57

Hallo,

ich denke, da mußt Du wohl 2 Zeilen daraus machen:

Delphi-Quelltext
1:
2:
L1.Caption := Form2.Edit1.Text;
IdHttp1.Get(L1.caption);


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Di 24.05.11 07:00

user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
L1.Caption := Form2.Edit1.Text;
IdHttp1.Get(L1.caption);
Und das Ergebnis wirfst du einfach weg... was hat das für einen Sinn?


colaka - Di 24.05.11 07:38

Ok,

dann muß es wohl so heißen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
Datei : TFilestream;
begin
L1.Caption := Form2.Edit1.Text;
IdHttp1.Get(L1.caption, Datei);
end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Di 24.05.11 08:37

In eine Datei schreiben ist hier doch gar nicht nötig. Es stand doch schon von Anfang an prinzipiell richtig da... :roll:

Du übergibst die Adresse und bekommst das Ergebnis als Rückgabewert. Warum du die Adresse plötzlich in den Label zwischenspeichern willst und stattdessen das Ergebnis wegwirfst, ist mir nicht wirklich klar. :nixweiss:

Wie gesagt: Eigentlich war die Zeile korrekt, vorausgesetzt das Formular Form2 existiert in dieser globalen Variablen...


Petros - Di 24.05.11 16:07

ja form2 exestriert. In der Form2 sind mehrere edit felder ich zeige es mal anhand des codes

Form1

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
procedure TForm1.FormCreate(Sender: TObject);
begin
L1.Caption  := IdHttp1.Get(Form2.Edit1.Text);
L2.Caption  := IdHttp2.Get(Form2.Edit2.Text);
L3.Caption  := IdHttp3.Get(Form2.Edit3.Text);
L4.Caption  := IdHttp4.Get(Form2.Edit4.Text);
L5.Caption  := IdHttp5.Get(Form2.Edit5.Text);
L6.Caption  := IdHttp6.Get(Form2.Edit6.Text);
L7.Caption  := IdHttp7.Get(Form2.Edit7.Text);
L8.Caption  := IdHttp8.Get(Form2.Edit8.Text);
L9.Caption  := IdHttp9.Get(Form2.Edit9.Text);
end

procedure TForm1.FormShow(Sender: TObject);
var
  ini: TIniFile;
  filename: string;
begin
  filename := ExtractFilePath(ParamStr(0)) + 'address.ini';
  ini := TIniFile.Create(filename);
  try
    form2.Edit1.Text := ini.ReadString('serveradressen''addresse1''');
    form2.Edit2.Text := ini.ReadString('serveradressen''addresse2''');
    form2.Edit3.Text := ini.ReadString('serveradressen''addresse3''');
    form2.Edit4.Text := ini.ReadString('serveradressen''addresse4''');
    form2.Edit5.Text := ini.ReadString('serveradressen''addresse5''');
    form2.Edit6.Text := ini.ReadString('serveradressen''addresse6''');
    form2.Edit7.Text := ini.ReadString('serveradressen''addresse7''');
    form2.Edit8.Text := ini.ReadString('serveradressen''addresse8''');
    form2.Edit9.Text := ini.ReadString('serveradressen''addresse9''');
  finally
    ini.Free;
  end;
end;


Form2

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm2.btn1Click(Sender: TObject);  // zum speichern der informationen für den nähsten abruf
var
  ini: TIniFile;
  filename: String;
 begin
  ini.Free;
  filename := ExtractFilePath(ParamStr(0)) + 'address.ini';
  ini := TIniFile.Create(filename);
  ini.WriteString('serveradressen''addresse1', Edit1.Text );
  ini.WriteString('serveradressen''addresse2', Edit2.Text );
  ini.WriteString('serveradressen''addresse3', Edit3.Text );
  ini.WriteString('serveradressen''addresse4', Edit4.Text );
  ini.WriteString('serveradressen''addresse5', Edit5.Text );
  ini.WriteString('serveradressen''addresse6', Edit6.Text );
  ini.WriteString('serveradressen''addresse7', Edit7.Text );
  ini.WriteString('serveradressen''addresse8', Edit8.Text );
  ini.WriteString('serveradressen''addresse9', Edit9.Text );
end;


ich bekomme nur die meldung von oben
Debugger Not..... ausgabe
"Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 005FD919 in module 'project1.exe'. Read of address 000002F8'. Process stopped. Use Step or Run to continue."

und dann makiert er mir in Form1 L1.Caption := IdHttp1.Get(Form2.Edit1.Text); aber keine error meldung oder andere warnungen

Die ausgegeben daten in den label.Captions übertrage ich manuell in einer exel Datenbank. eigendlich sollte das so funktionieren zumindest laut meiner logik aber ich kann mich auch täuchen und irgendwo einen fehler drin haben


MDX - Di 24.05.11 16:30

Also mal eine Sache:
Wieso nutzt du NEUN Indy-Komponenten??

Und wenn es geht (also von deiner Programmfunktion her) würde ich dir raten EINMAL eine Seite mit allen Labelbeschriftungen abrufen und diese einfach mit einem speziellen Zeichen zu trennen (z.B. "|" oder ";") und dann einfach die Ausgabe via Explode (Einfach bei Google suchen) auszugeben, dann brauchst du keine 9 mal irgendeine Seite herunterladen....


Petros - Di 24.05.11 16:33

OK habe den fehler schon gefunden ich musste nur vom Form1.create und form1.show umtauschen damit funktioniert das dann auch....


MDX - Di 24.05.11 16:35

Ich meinte nicht die Version, sondern wieso du 9 Indy-Komponenten auf deine Form packst, bzw. in deinem Projekt benutzt und nicht einfach nur Eine? Damit kannst du auch alle Sachen nacheinander herunterladen...


Petros - Di 24.05.11 16:40

sry ich hatte mich verlesen gehabt und als ich grad mein text editieren wollte stand deins schon da ja das hatte ich mir auch schon überlegt alles über eine idhttp laufen zu lassen aber wie mache ich das???


die datein ändern sich alle stunde und alle 2 tage werden neue daten geschrieben deshalb lass ich sie ja alle gleichzeitig anzeigen. mir ist da kein besserer weg eingefallen früher habe ich die datein vom server per ftp geladen und manuell per editos ausgelesen aber das war mir zu umständlich..


glotzer - Di 24.05.11 16:51


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.FormCreate(Sender: TObject);
begin
L1.Caption  := IdHttp1.Get(Form2.Edit1.Text);
L2.Caption  := IdHttp1.Get(Form2.Edit2.Text);
L3.Caption  := IdHttp1.Get(Form2.Edit3.Text);
L4.Caption  := IdHttp1.Get(Form2.Edit4.Text);
L5.Caption  := IdHttp1.Get(Form2.Edit5.Text);
L6.Caption  := IdHttp1.Get(Form2.Edit6.Text);
L7.Caption  := IdHttp1.Get(Form2.Edit7.Text);
L8.Caption  := IdHttp1.Get(Form2.Edit8.Text);
L9.Caption  := IdHttp1.Get(Form2.Edit9.Text);
end


was ist daran denn so schwer? :p


MDX - Di 24.05.11 16:52

Naja, du machst einfach statt idhtpp1.Get, idhttp2.get etc. immer nur idhttp1.get und löschst die anderen 8 Komponenten ;) hat exakt die gleiche Funktion, spart dafür z.B. auch Speicher (sollte es zumindest ^^) und falls mal ein Fehler ist, brauchst du nicht alle Komponenten anschauen ob der Client falsch ist oder so ;)


Petros - Di 24.05.11 16:53

ok ich werd gleich mal versuchen ich hatte immer angenommen das das so nicht geht das jeder abruf eine eigene koponete braucht...


MDX - Di 24.05.11 16:56

Nö ;)

Du kannst das ganze auch noch mit einer While-Schleife o.ä komprimieren (sollte funktionieren), wenn die Labelnamen und die Editfelder die gleiche Zahl haben...


Petros - Di 24.05.11 16:59

so habs mal versucht über eine idhttp laufen zu lassen aber da bekomm ich einen fehler ausgegeben

siehe bild im anhang


MDX - Di 24.05.11 17:06

Poste mal die Einstellungen von der Indy-Komponente...


Petros - Di 24.05.11 17:17

ich hoffe das ist das richtige was du meinst

siehe anhang bild

hier noch mal der ganze quelltext

Form1

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit Unit1;

interface

uses
  Windows, IniFiles, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    L1: TLabel;
    L2: TLabel;
    L3: TLabel;
    L4: TLabel;
    L5: TLabel;
    L6: TLabel;
    L7: TLabel;
    L8: TLabel;
    L9: TLabel;
    button2: TButton;
    button3: TButton;
    procedure button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.button2Click(Sender: TObject);
begin
L1.Caption  := IdHttp1.Get(Form2.Edit1.Text);
L2.Caption  := IdHttp1.Get(Form2.Edit2.Text);
L3.Caption  := IdHttp1.Get(Form2.Edit3.Text);
L4.Caption  := IdHttp1.Get(Form2.Edit4.Text);
L5.Caption  := IdHttp1.Get(Form2.Edit5.Text);
L6.Caption  := IdHttp1.Get(Form2.Edit6.Text);
L7.Caption  := IdHttp1.Get(Form2.Edit7.Text);
L8.Caption  := IdHttp1.Get(Form2.Edit8.Text);
L9.Caption  := IdHttp1.Get(Form2.Edit9.Text);
end;

procedure TForm1.FormShow(Sender: TObject);
var
  ini: TIniFile;
  filename: string;
begin
  filename := ExtractFilePath(ParamStr(0)) + 'address.ini';
  ini := TIniFile.Create(filename);
  try
    form2.Edit1.Text := ini.ReadString('serveradressen''addresse1''');
    form2.Edit2.Text := ini.ReadString('serveradressen''addresse2''');
    form2.Edit3.Text := ini.ReadString('serveradressen''addresse3''');
    form2.Edit4.Text := ini.ReadString('serveradressen''addresse4''');
    form2.Edit5.Text := ini.ReadString('serveradressen''addresse5''');
    form2.Edit6.Text := ini.ReadString('serveradressen''addresse6''');
    form2.Edit7.Text := ini.ReadString('serveradressen''addresse7''');
    form2.Edit8.Text := ini.ReadString('serveradressen''addresse8''');
    form2.Edit9.Text := ini.ReadString('serveradressen''addresse9''');
  finally
    ini.Free;
  end;
end;

procedure TForm1.button3Click(Sender: TObject);
begin
form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
L1.Caption  := IdHttp1.Get(Form2.Edit1.Text);
L2.Caption  := IdHttp1.Get(Form2.Edit2.Text);
L3.Caption  := IdHttp1.Get(Form2.Edit3.Text);
L4.Caption  := IdHttp1.Get(Form2.Edit4.Text);
L5.Caption  := IdHttp1.Get(Form2.Edit5.Text);
L6.Caption  := IdHttp1.Get(Form2.Edit6.Text);
L7.Caption  := IdHttp1.Get(Form2.Edit7.Text);
L8.Caption  := IdHttp1.Get(Form2.Edit8.Text);
L9.Caption  := IdHttp1.Get(Form2.Edit9.Text);
end;

end.


Form2

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
unit Unit2;

interface

uses
  Windows, Messages, IniFiles, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    button2: TButton;
    procedure button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.button2Click(Sender: TObject);
var
  ini: TIniFile;
  filename: String;
 begin
  filename := ExtractFilePath(ParamStr(0)) + 'address.ini';
  ini := TIniFile.Create(filename);
  ini.WriteString('serveradressen''addresse1', Edit1.Text );
  ini.WriteString('serveradressen''addresse2', Edit2.Text );
  ini.WriteString('serveradressen''addresse3', Edit3.Text );
  ini.WriteString('serveradressen''addresse4', Edit4.Text );
  ini.WriteString('serveradressen''addresse5', Edit5.Text );
  ini.WriteString('serveradressen''addresse6', Edit6.Text );
  ini.WriteString('serveradressen''addresse7', Edit7.Text );
  ini.WriteString('serveradressen''addresse8', Edit8.Text );
  ini.WriteString('serveradressen''addresse9', Edit9.Text );
    ini.Free;
end;

end.


jaenicke - Di 24.05.11 17:52

Häng am besten einfach einmal das Projekt insgesamt an, also die .pas, .dfm und .dpr Dateien als Zip-Archiv. Dann lässt sich das viel einfacher nachvollziehen...


Petros - Di 24.05.11 18:01

alle datein sind als zip gepackt und im anhang


Petros - Mo 06.06.11 16:12

Habs jetzt mit einem onTime event gelöst


danke für eure hilfe

MFG Petros