Autor Beitrag
IMPEGA
Hält's aus hier
Beiträge: 5

Win 11
Delphi 12
BeitragVerfasst: Sa 20.12.08 14:04 
Hi Leute.
Ich schreibe zwar wernig in Forum dafür lesen tue ich sehr viel.Vor enigen Zeit bin ich von VB zu Delphi gewandert.
Gelernt habe ich es bis jetzt nur autodidakt, das wird sich wohl auch nicht mehr ändern. Für die Schule bin ich mit 43 wohl etwas zu alt.

Nun zu meinem Problem. Ich habe mehr oder wenig erfolgreich mehrere Tools schon geschrieben. Alles mit Delphi 2007.

Nun habe ich testweise Delphi 2009 installiert. Soweit gefällt mir 2009 viel bessser. Paar Funktionen sind verbessert,leider aber paar Sachen auch geändert.
Ich habe schon immer Probleme mit Typen gehabt. Irgendwie habe ich es aber immer wieder auf die Reihe bekommen.
In einigen Tools benutze ich diese IP Abfrage.

ausblenden volle Höhe 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:
procedure TRequestPublicIP.Execute;
  const
    // Liste der verwendeten IP-Detector-Dienste; ggfs. erweitern
    DetectorService: array[0..2of String = (
      'http://www.whatismyip.com',
      'http://www.wieistmeineip.de',
      'http://www.heise.de/netze/tools/ip/'
      );
  var
    RE: TRegExpr;
    IdHTTP: TIdHTTP;
    i: Integer;
    IP: in_addr;
begin
  FSuccess := FALSE; // Default-Ergebnis: Fehler
  FResult := 'Unknown error'// Default-Fehlertext: keine Details
  RE := TRegExpr.Create;
  IdHttp := TIdHTTP.Create(NIL);
  try
    RE.Expression := '(\d{1,3}\.){3}\d{1,3}'// vier 3stellige Zahlen mit Punkt
    i := 0;
    // solange noch keine IP-Adresse ermittelt wurde und noch ein Dienst da ist
    while ( (NOT FSuccess) and (i <= High(DetectorService)) ) do begin
      try
        FSuccess := RE.Exec(IdHTTP.Get(DetectorService[i])); // Seite holen und auswerten
        if FSuccess then begin // wenn eine passende Zeichenfolge gefunden wurde
          FResult := RE.Match[0];
IP.S_addr := inet_addr(PChar(FResult)); // in IPv4 (bin) wandeln
          FSuccess := (IP.S_addr <> INADDR_ANY); // Adresse gültig?
          if FSuccess then // ja, dann wieder
            FResult := inet_ntoa(IP) // in einen String umwandeln
          else
            FResult := 'Invalid address: '+RE.Match[0];
        end
        else
          FResult := 'IP address not found';
      except
        FResult := Exception(ExceptObject).Message;
      end;
      Inc(i); // nächsten Detector-Dienst abfragen
    end;
  finally
    IdHTTP.Free;
    RE.Free;
  end;
end;


Unter Delphi 2009 bekomme immer diese Fehlermeldung:

Zeile 28 --> IP.S_addr := inet_addr(PChar(FResult)); // in IPv4 (bin) wandeln
[DCC Fehler] ReqPubIP.pas(57): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'

Zeile32 --> else
[DCC Warnung] ReqPubIP.pas(61): W1057 Implizite String-Umwandlung von 'AnsiChar' zu 'string'


Leider schnalle ich es nicht ganz wie es geändert werden muss.
Kann mir Jemand es verbessern, aber mit Erklärung wenns geht, so daß ich mir später die Sachen selbst korrigieren kann.
Für jede Hilfe bin ich dankbar.

Zusatz:
Bitte nicht danke ich würde nur fertige Sachen benutzen ohne Sinn und Verstand. Das stimmt nämlich nicht.
Ich schreibe was ich kann selbst, wenn snicht klappt sucvhe eine Vorlage, versuche die zu verstehen, schreibe es um oder nutze nur Teile davon wie auch immer. Schulwissen fehlt mir, doch einiges klappt ganz gut.
Einige Proceduren muß man auch nicht selbst erfinden, was schon erfunden wurde. Wir benutzen auch Alle Räder beim fahren. Erfunden haber wir das Rad aber auch nicht. Oder ?

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von IMPEGA am Sa 20.12.08 15:38, insgesamt 2-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 20.12.08 14:21 
Ich habe kein Delphi 2009, aber vielleicht genügt es, alle Strings durch AnsiStrings, Chars durch AnsiChars und PChars und PAnsiChars zu ersetzen. Delphi 2009 ist komplett auf Unicode umgestellt, d.h. Strings nicht nicht mehr per Standard Ansistrings, sondern Widestrings. Für Chars und PChars gilt analog dasselbe.
IMPEGA Threadstarter
Hält's aus hier
Beiträge: 5

Win 11
Delphi 12
BeitragVerfasst: Sa 20.12.08 14:27 
Die Idee habe ich auch schon gedacht. Habe soweit es mir verständlich war experimentiert. Leider ohne Erfolg.
Bin letztendlich zum Entrschluss gekommen, wenn man es nicht ausreichend versteht,bringt es wenig, weil es auch komplexer zusammenhängen kann als es scheint. Sprich, an einer Stelle wir eben richtig korrigiert, dafür aber an anderen falsch geändert. So kann man Tage verbringen um zu probieren. Ich habe schon einige Zeit probiert bevor ich meine Frage gestellt habe.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 20.12.08 14:32 
Vermutlich brauchst Du auch eine Unicode-fähige Version von TRegExpr, außerdem kannst Du mittels Index(StringVar[i]) nur auf AnsiStrings zugreifen. Mehr kann ich Dir leider auch nicht sagen, aber AFAIK gibt es in der Hilfe zu Delphi 2009 eine Anleitung zur Anpassung älterer Projekte.
IMPEGA Threadstarter
Hält's aus hier
Beiträge: 5

Win 11
Delphi 12
BeitragVerfasst: Sa 20.12.08 15:26 
Ich habe inzwischen eine einfachere Methode gefunden um die IP zu erfassen. Möchte aber unbedingt das alte Problem verstehen. Für jede weitere Hilfe bion ich dankbar.

Hier meine neue Lösung.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function InternetIP(): string;
var
  IdHTTP: TIdHTTP;
  IP: string;
begin
  Result := '';
  IdHTTP := TIdHTTP.Create;
  try
    IP := IdHTTP.Get('http://MeinAccountbeiFunpic.bl.funpic.de/IP.php');
  finally
    IdHTTP.Free;
  end;
  Result := IP;
end;


{
Das ist mein IP.php Script
<?php
Print $REMOTE_ADDR;
?>
}


Zuletzt bearbeitet von IMPEGA am Sa 20.12.08 15:33, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 20.12.08 15:32 
Welche Zeilen im geposteten Quelltext gehören denn zu den in der Fehlermeldung angegebenen Zeilen? ;-)

Schreib das am besten im Forum immer einfach so, dass du angibst welche Zeile im echten Quelltext hier die erste ist:
ausblenden Quelltext
1:
2:
3:
4:
<div class="syntaxContainer">  <div class="syntaxSelect">    <a class="genmed" style="text-decoration: none" href="javascript:selectAll(54004010)">markieren</a>  </div>  <div class="syntaxTitle genmed">        <a style="text-decoration: none" href="javascript:toggleCode(54004010)">            <span  id="minusFor54004010"><img class="codecollapse crispscaling" align="top" src="./graphics/bbcode/code_hide.png" border="0" alt="ausblenden" title="ausblenden"/></span>            <span style="display: none;" id="plusFor54004010"><img class="codecollapse crispscaling" align="top" src="./graphics/bbcode/code_show.png" border="0" alt="anzeigen" title="anzeigen"/></span>        </a>                <b>Delphi-Quelltext</b>        <span class="copyright" style="display: none" id="hintFor54004010">                       </span>  </div>  <div id="code54004010" class="syntax" style=" ">    <table cellspacing="0" cellpadding="0">      <tr>        <td valign="top" style="text-align: right; padding-right: 3px; border: #DBE4EB solid; border-width: 0px 1px 0px 0px;">          <pre> 
22:
</pre>        </td>        <td valign="top" style="width: 100%; padding-left: 3px;">          <pre class="sourcecode"><span style="color: #777777">{ ... }</span>
<span class="codecomment">{PROTECTTAGeef98a5ecd9fbd23d40f49debc7a391f}</span>          </pre>        </td>      </tr>    </table>  </div></div>
ergibt
ausblenden Delphi-Quelltext
 
22:
23:
{ ... }
Test
Test2
IMPEGA Threadstarter
Hält's aus hier
Beiträge: 5

Win 11
Delphi 12
BeitragVerfasst: Sa 20.12.08 15:53 
Das Problkem habe ich auf 2 Zeilen begrenzt.
Es werden halt immer die typen angepasst. Ic h blicke echt nicht durch warum man es eigentlich immer ändert.
Habe hier die beiden Zeilen verändert und es lüpft. Das ist aber immer noch nicht die Antwort auf meine Frage.
Ich versuche zumindest den Code zu verstehen. Leider noch ohne Erfolg.

ausblenden volle Höhe 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:
procedure TRequestPublicIP.Execute;
  const
    // Liste der verwendeten IP-Detector-Dienste; ggfs. erweitern
    DetectorService: array[0..2of String = (
      'http://MeinAccbeiFunpic.bl.funpic.de/Scripte/IP.php',
      'http://www.wieistmeineip.de',
      'http://www.heise.de/netze/tools/ip/'
      );
  var
    RE: TRegExpr;
    IdHTTP: TIdHTTP;
    i: Integer;
    IP: in_addr;
begin
  FSuccess := FALSE; // Default-Ergebnis: Fehler
  FResult := 'Unknown error'// Default-Fehlertext: keine Details
  RE := TRegExpr.Create;
  IdHttp := TIdHTTP.Create(NIL);
  try
    RE.Expression := '(\d{1,3}\.){3}\d{1,3}'// vier 3stellige Zahlen mit Punkt
    i := 0;
    // solange noch keine IP-Adresse ermittelt wurde und noch ein Dienst da ist
    while ( (NOT FSuccess) and (i <= High(DetectorService)) ) do begin
      try
        FSuccess := RE.Exec(IdHTTP.Get(DetectorService[i])); // Seite holen und auswerten
        if FSuccess then begin // wenn eine passende Zeichenfolge gefunden wurde
          FResult := RE.Match[0];
//IP.S_addr := inet_addr(PChar(FResult)); // in IPv4 (bin) wandeln
          FSuccess := (FResult <> 'nil'); // Adresse gültig?
          if FSuccess then // ja, dann wieder
//FResult := inet_ntoa(IP) // in einen String umwandeln
          else
            FResult := 'Invalid address: '+RE.Match[0];
        end
        else
          FResult := 'IP address not found';
      except
        FResult := Exception(ExceptObject).Message;
      end;
      Inc(i); // nächsten Detector-Dienst abfragen
    end;
  finally
    IdHTTP.Free;
    RE.Free;
  end;
end;


Zeilen 28 und 31 habe ich einfach deaktiviert.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 20.12.08 18:05 
user profile iconIMPEGA hat folgendes geschrieben Zum zitierten Posting springen:
Ic h blicke echt nicht durch warum man es eigentlich immer ändert.
Du meinst, warum Delphi plötzlich Unicode unterstützt? Diese Änderung passiert jetzt einmal, vorher ist das ja (abgesehen vom Wechsel von ShortString ganz am Anfang) gleich geblieben. ;-)
Und anders kann man eben nicht auch andere Schriftzeichen anzeigen.

user profile iconIMPEGA hat folgendes geschrieben Zum zitierten Posting springen:
Habe hier die beiden Zeilen verändert und es lüpft.
Was passiert ist ja, dass der Fund versucht wird in eine IP-Adresse umzuwandeln und zurück. Wenn du das weg lässt, dann wird der gefundene Teil der Seite nicht auf eine gültige IP überprüft, aber wenn eine IP gefunden wurde, dann geht es eben einfach. Es wurde ja nur nicht geprüft, dass es wirklich eine ist.

user profile iconIMPEGA hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  IP.S_addr := inet_addr(PChar(FResult)); // in IPv4 (bin) wandeln
  FSuccess := (FResult <> 'nil'); // Adresse gültig?
  if FSuccess then // ja, dann wieder
    FResult := inet_ntoa(IP) // in einen String umwandeln
Das Problem ist, dass FResult (vermutlich?) bei dir ein String ist. Das ist ein Unicode-String! Deklariere FResult als AnsiString, dann hast du einen alten String, den du mit inet_addr(PAnsiChar(FResult)) benutzen kannst. Da inet_addr ohnehin einen PAnsiChar erwartet und keine Unicodeunterstützung hat (wäre bei einer IP ja auch nicht nötig :D) ist das keine Einschränkung. Genauso gibt inet_ntoa einen PAnsiChar zurück. Den kannst du dann normal deinem AnsiString zuweisen, dann funktioniert die Zeile unverändert.

Den alten AnsiString FResult kannst du mit String(FResult) in einen neuen String casten, ebenso umgekehrt. Natürlich musst du dabei immer beachten, dass ein Unicodestring evtl. Zeichen enthält, die ohne Unicode nicht dargestellt werden können. Dann verlierst du beim Cast in einen alten AnsiString Daten, deshalb kommt ohne den Cast die Warnung vor der impliziten Umwandlung.
IMPEGA Threadstarter
Hält's aus hier
Beiträge: 5

Win 11
Delphi 12
BeitragVerfasst: Sa 20.12.08 19:56 
Zitat:
Das Problem ist, dass FResult (vermutlich?) bei dir ein String ist.

Ja so ist es.
Habe FResult als AnsiString deklariert und es geht.
Ich muss mir allerdings dein texp paar Mal durchlesen, vielleicht paar Beispiele ausprobieren.
Irgendwie habe ich es nicht wirklich geschnallt. Sprich : Ich weiß wie ich es zu ändern habe, allerdings nicht so verstanden habe daß ich es frei benutzen könnte.
Ich danke dir für deine schnelle Antwort.
Auch ein Dank an DeddyH für diE Hilfestellung.