Autor Téma: Tstrings poradite  (Přečteno 3235 krát)

M.M

  • Host
Tstrings poradite
« kdy: 26-06-2012, 17:04:43 »
Dobry den.
S delphi jsem začal nedávno a Tstrings jsem už jednou používal.
S tímto si však nějak nedovedu poradit.
Kód: Delphi [Vybrat]
  1. http://www.swissdelphicenter.ch/torry/showcode.php?id=67

Když mam v adapteru nastavené vice IP jak získám tu první.
Co mam špatně

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var adresa:string;
  3. begin
  4.  adresa = GetIps(1);
  5. end;
  6.  

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:Tstrings poradite
« Odpověď #1 kdy: 26-06-2012, 18:05:50 »
Používáš to úplně blbě, to je celé :-)
Kód: Delphi [Vybrat]
  1. var L: TStringList;
  2. begin
  3.   L := getIPs;
  4.   try
  5.     if L.Count > 0 then
  6.       Writeln('Prvni adresa je: ' + L[0])
  7.     else
  8.       Writeln('Neni zadna adresa');
  9.   finally
  10.     L.Free;
  11.     end;
  12. end;
  13.  

M.M

  • Host
Re:Tstrings poradite
« Odpověď #2 kdy: 27-06-2012, 05:50:58 »
getIPs vraci Tstrings a ja lama si to splet s TStringList  ;)
No jo no, začatky.

Mužu ještě dotaz.
V D7 ok

Delphi XE2 vyhazuje chybu.

L := getIPs; 
[DCC Error] Unit1.pas(119): E2010 Incompatible types: 'TStringList' and 'TStrings'

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:Tstrings poradite
« Odpověď #3 kdy: 27-06-2012, 06:52:11 »
getIPs vraci Tstrings a ja lama si to splet s TStringList  ;)
No jo no, začatky.
Hlavně si pleteš TStrings s string a/nebo výběr prvku pole (hranaté závorky) od předání parametru funkci (kulaté závorky).
Jinak TStringList je potomkem TStrings, tzn. jsou typově kompatibilní.

Citace
Delphi XE2 vyhazuje chybu.

L := getIPs; 
[DCC Error] Unit1.pas(119): E2010 Incompatible types: 'TStringList' and 'TStrings'
I v Delphi je TStringList potomkem TStrings. Tzn. pokud používáš System.Classes.TStrings a System.Classes.TStringList a přiřazuješ TStrings do TStringList, tak to musí fungovat (obráceně ne).

M.M

  • Host
Re:Tstrings poradite
« Odpověď #4 kdy: 27-06-2012, 07:51:58 »
Tak  proč mi to nefunguje a vyhazuje tu chybu.
Vyhazuje to to same i v Delphi 7 i v Turbo delphi lite.
Poprosil jsem kamoše, aby to vyzkoušel a vyprd se na mně a tvrdil že mu to funguje, pak přiznal že se na to vykašlal.

http://i49.tinypic.com/2d8oz9x.jpg

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 574
  • Karma: 25
Re:Tstrings poradite
« Odpověď #5 kdy: 27-06-2012, 08:25:44 »
Tak  proč mi to nefunguje a vyhazuje tu chybu.

Protože ti to napsal obráceně. Logicky do předka můžeš přiřadit potomka, ale ne obráceně. Takže můžeš deklarovat TStrings a dávat do něj TStringList, ale ne deklarovat TStringList a cpát do něj TStrings, protože to může být i něco jiného než TStringList

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 204
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Tstrings poradite
« Odpověď #6 kdy: 27-06-2012, 09:08:36 »
Změň si deklaraci :

function getIPs: Tstrings;

na TStringlist, vevnitř se stejně vytváří TStringList:

function getIPs: TStringList;

Pak ti to bude fungovat. Ale pozor ! Funkce napsané jako v předchozím případě jsou nejlepší cestou, jak vytvářet memoryleaky, protože se zapomene uvolnit předaný Result. V tvém případě jsi to také zapomněl.

Já bych to předělal na předání parametru s typem TStringList:

procedure getIPs(var aSeznamIP: TStringList);

Předávanou proměnnou si nejdříve vytvoříš, předáš, pak ji použiješ a nakonec uvolníš.

zokzok

  • Host
Re:Tstrings poradite
« Odpověď #7 kdy: 27-06-2012, 12:32:49 »
Inak ak hladas cestu ako zistit prvu IP tak ta moc nepotesim. Ja som s tym par tyzdnov bojoval ale ked mas u zakaznikov heterogenne prostredie tak to aj tak nefunguje spolahlivo, momentalne kombinujem WinSock+GetHostName, Netbios, a SendARP(iphlpapi.dll) a na servri mam este php skript ktory mi povie skutocnu ip adreresu, a len ak ta serverovska cast neodpovie tak sa spolieham (s trochou magie) na tie prve 3 metody.

M.M

  • Host
Re:Tstrings poradite
« Odpověď #8 kdy: 27-06-2012, 14:13:48 »
Pry je v synapse už něco hotoveho na zjištěni IP.
Nevite jak na to.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:Tstrings poradite
« Odpověď #9 kdy: 27-06-2012, 18:43:38 »
Tak  proč mi to nefunguje a vyhazuje tu chybu.
http://i49.tinypic.com/2d8oz9x.jpg
Protože jsi to napsal jinak, než jsem ti to napsal. Když chceš radu, tak by sakra bylo vhodné se pak podle ní zařídit, ne to znovu zkoušet blbě a divit se, že to nejde. Napiš to tak, jak jsem ti radil, a až ti to v kompilátoru projde, tak potom teprve začni uvažovat, jak to předělat pro svoje potřeby. Tvůj přístup, kdy to evidentně bez znalostí věci rovnou přepíšeš jinak, a když to (pochopitelně) nefunguje, tak to celé zahodíš a napíšeš to zase jinak (zase nefunkčně), k cíli nevede. Dokud nebudeš vědět, co děláš, tak zásadně postupuj po malých jistých krocích. (To samé doporučení ostatně platí i pro případy, kdy víš, co děláš, akorát že "malý jistý krok" je mnohem větší pro experta než pro začátečníka - ale princip je u obou stejný.)

Faktem je, že zobrazená chybová hláška Delphi je silně zavádějící. Primární problém je podle mě v tom, že na řádku 56 zapisuješ do read-only property Memo1.Lines. To další, jako třeba neuvolnění alokované paměti apod., jsou vedle toho jen detaily.
« Poslední změna: 27-06-2012, 18:48:29 od pepak »

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:Tstrings poradite
« Odpověď #10 kdy: 27-06-2012, 18:47:36 »
Inak ak hladas cestu ako zistit prvu IP tak ta moc nepotesim.
V podstatě asi souhlasím, ale nabízí se otázka, proč zjišťovat první IP adresu. Normálně "první adresu" k ničemu nepotřebuješ, jedině pro její zabalení do aplikačního packetu, ale to je obvykle jedna z největších blbostí, které můžeš udělat (v podstatě tím vážeš funkčnost své aplikace na jednu konkrétní strukturu sítě a na žádné jiné to nebude fungovat). Jediné "rozumné" použití, které mě napadá, je test, jestli uživatelem zadaný server je lokální nebo vzdálený počítač, a tam stejně potřebuješ adresy všechny, protože na pořadí, které ti WinSock vrátí, se spoléhat nedá.

M.M

  • Host
Re:Tstrings poradite
« Odpověď #11 kdy: 27-06-2012, 18:52:24 »
Vim že nejsem žadny programator, prostě si chci jen trochu ulehčit v praci. 
Delphi jsem měl jen ve škole a to mně spiš zajimali holky než programovaní.
No pokud to nedam, uspokojim se i tym memo no  :'(