Help w wskaznikach

0

Pomocy bo jestem za cienki!!!!

Chodzi mi o zadeklorowanie zmiennej "ile" i "txt". Pierwsza jest typu: word zas druga typu: array[1..20] of char.
Nie wiem jak to zrobic aby były jako wskażniki.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure ComboBox1DropDown(Sender: TObject);
  private
    { Private declarations }

  public
     { Public declarations }
  end;

type
  FT_Result = Integer;

var
  Form1: TForm1;

implementation
function FT_ListDevices(pvArg1:Dword;pvArg2:Pointer;dwFlags:Dword) : FT_Result ; stdcall ; External 'FTD2XX.dll' name 'FT_ListDevices';

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
ftStatus : FT_Result;
FTopis:string;
begin
ftStatus:= FT_ListDevices(@ile,nil,FT_LIST_NUMBER_ONLY);

for i := 1 to 20 do txt[i] := '';
if ile>0 then
      begin

        for i:=0 to ile-1 do
            begin
                  FT_ListDevices(i,@txt,(FT_OPEN_BY_DESCRIPTION or FT_LIST_BY_INDEX));
                  FTOpis:=txt[i];
                  ListBox1.Items.Add(FTOpis);
            end;

      end;

end;

end.


Zdrowka
Kochzg

0

wskaźniki NA CO?

0

Moze zle <ort>ujelem </ort>sprawe.
Jak zadeklaruje w ten sposób:

ile: dword;
txt:array[1..20] of char;

to mi wywala błąd:
Incompatible types: 'Cardinal' and 'Pointer'

0

U mnie wszystko się kompiluje :>
Wklej najlepiej cały kod.. włącznie z umieszczonymi przez Ciebie zmiennymi

0

Wlasnie to jest cały kod tylko nie wiem w ktorym miejscu i jak zadeklarować te zmiene.

KOchzg

0

zapraszam na:
http://4programmers.net/Delphi/Łańcuchy/Konwersje
jeśli jeszcze czegoś nie rozumiesz to pisz ;-)

0

A po co mi konwersje ???? Mam małą prośbę do PoP_Gniezno, jezeli nie chcesz pomoc to lepiej nic nie pisz. Nie odsyłaj mnie do jakis artykułów których do niczego mi nie potrzebne. Jezeli moj kod u Ciebie chodzi to napisz co zrobiłeś.

Zdrowka
Kochzg

0
ftStatus:= FT_ListDevices(@ile,nil,FT_LIST_NUMBER_ONLY);

for i := 1 to 20 do txt[i] := '';
if ile>0 then
      begin

        for i:=0 to ile-1 do
            begin
                  FT_ListDevices(i,@txt,(FT_OPEN_BY_DESCRIPTION or FT_LIST_BY_INDEX));

Popatrz na pierwszy i ostatni wiersz.
W pierwszym przekazujesz adres ile (czyli wskaźnik na ile), a w ostatnim przekazujesz wartość "i". Funkcja potraktuje to jako indeks, ale kompilator się stawia, no to go oszukajmy.
"FT_ListDevices( POINTER(i) ,@txt,("
Wartość przekazywana do funkcji nie zmieni się, a kompilator będzie zadowolony.

0

Dalej mi to nic nie daje. Moze z innej beczki. W bibliotece FTD2XX.dll znajduje sie funkcja:

FT_STATUS FT_ListDevices (PVOID pvArg1, PVOID pvArg2, DWORD dwFlags)

Nastepnie w manualu piszą:

In its simplest form, it can be used to return the number of devices currently connected. If
FT_LIST_NUMBER_ONLY bit is set in dwFlags, the parameter pvArg1 is interpreted as a pointer
to a DWORD location to store the number of devices currently connected.

It can be used to return device information: if FT_OPEN_BY_SERIAL_NUMBER bit is set in
dwFlags, the serial number string will be returned; if FT_OPEN_BY_DESCRIPTION bit is set in
dwFlags, the product description string will be returned; if FT_OPEN_BY_LOCATION bit is set in
dwFlags, the Location ID will be returned; if none of these bits is set, the serial number string will
be returned by default.

It can be used to return device string information for a single device. If FT_LIST_BY_INDEX and
FT_OPEN_BY_SERIAL_NUMBER or FT_OPEN_BY_DESCRIPTION bits are set in dwFlags, the
parameter pvArg1 is interpreted as the index of the device, and the parameter pvArg2 is
interpreted as a pointer to a buffer to contain the appropriate string. Indexes are zero-based, and
the error code FT_DEVICE_NOT_FOUND is returned for an invalid index.

Cały problem polega na tym że w zależności jakiego używasz dwFlags zmieniają się typy pvArg1 i pvArg2. I nie wiem jak nimi manewrować.

Krótko mówiąc chce wiedzieć czy jest podłączone jakies urządzenie, ile ich jest i wyswietlić wszystkie.

Kochzg</b>

0

OK juz sobie poradziłem, musiałem dwukrotnie zaimportować to samą funkcję ale z innymi typami:

function FT_ListDevices(pvArg1:Pointer;pvArg2:Pointer;dwFlags:Dword) : FT_Result ; stdcall ; External 'FTD2XX.dll' name 'FT_ListDevices';
function FT_GetDevices(pvArg1:Dword;pvArg2:Pointer;dwFlags:Dword) : FT_Result ; stdcall ; External 'FTD2XX.dll' name 'FT_ListDevices';

Jezeli ktos ma inny pomysł to chetnie przeczytam
Zdrowka
Kochzg

0

Rzutować nie potrafisz?

Funkcja ma zadeklarowany parametr jako wskaźnik - Pointer, PDWord, Pptica, itp.

  1. masz przesłać adres -> dajesz normalnie: @ile
  2. masz dać liczbę -> rzutujesz ją na adres: Pointer(ile), rozmiar integera nie przekroczy rozmiaru adresu czyli wejdzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1