Wskaznik jako parametr funkcji

0

w bcb jest to proste jak drut:

void costam(Variant * p)
{
    p->OlePropertyGet(...);
}

zas w delphi jakbym chcial przekazac wskaznik z c++, przy:

procedure CloseExcelApp(App:^OleVariant; WorkBook:^OleVariant ); // linia błędu
begin
  WorkBook^.Saved = 1;
  App^.DisplayAlerts:= 0;
  WorkBook^.ActiveWorkBook.Close(SaveChanges:= 0);
  App^.Quit;
  App^:= UnAssigned;
end;

wyskakuje blad Identifier Expected but ^ found

sam juz nie wiem co robic. starsznie trudno odwolywac sie do excela z poziomu buildera (szczegolnie jezeli chodzi o zmiane formatu komorki (dodanie obramowania itp.) w delphi wyglada to strasznie prosto dlatego proboje odwoloywac sie do konkretnych funkcji, ale delphi ma strasznie skopana obsluge wskaznikow.

3

Nic nie jest skopane nie wiem dokładnie co kombinujesz ale pewnie masz przekazać Pointer i wtedy:

procedure CloseExcelApp(App: POleVariant; WorkBook: POleVariant);
begin
  WorkBook^.Saved:= 1;
  App^.DisplayAlerts:= 0;
  WorkBook^.ActiveWorkBook.Close(SaveChanges:= 0);
  App^.Quit;
  App^:= UnAssigned;
end;

lub normalnie:

procedure CloseExcelApp(App: OleVariant; WorkBook: OleVariant);
begin
  WorkBook.Saved:= 1;
  App.DisplayAlerts:= 0;
  WorkBook.ActiveWorkBook.Close(SaveChanges:= 0);
  App.Quit;
  App:= UnAssigned;
end;
3

Nie jestem niestety ekspertem w Pointerach i rzadko je stosuje jeśłi nie musze. Nie wiem czy o takie coś jak poniżej Tobie chodzi, ale powinieneś pojąć ideę. Kod kompilowałem na szybko pod Delphi 7. Mam nadzieję, że tak się to powinno to robić i wszystko ok zwalniam bez wycieków.

Jakby co, to ktoś tutaj jeszcze coś Tobie lepszego pewnie doradzi. Po prostu nie można się było raczej nigdy, ani w Delphi, ani w FPC, ani nawet w starusieńkim Turbo Pascalu w taki sposób odwoływać do nieprostych typów jako parametrów dla procedur czy funkcji. Należy zrobić sobie osobny typ, tak jak to widzisz w poniższym kodzie. Dlatego zawsze masz te wszelkie typy jak PWord, PByte, PChar, czy inne typy obiektowe albo wskażniki na struktury. Zwane też pod Pascalem typami rekordowymi.

Nie wiem dlaczego tak musi być, może da się inaczej. Nie wnikam jednak. A dlaczego tak się da w językach C++ i moze w C, że wszystko uproszczamy? Też tego nie wiem i nie chcę za bardzo wnikać. To są dziwne języki, nie znam ich dobrze i nie lubię. Poza tym niestety czy tego ktoś chce czy nie, po prostu one delikatnie mówią "sux", ale to już offtopic. Każdy pisze w czym lubi i co dobrze zna. Delphi i Pascal są prostsze na start, ale niestety już niszowe. Tylko to przez politykę Borlanda, a nie jest to wina ludzi w nim piszących czy twórców wersji początkowych środowisk.

Ale jeśli ktoś tutaj nieraz z anonima może pierdzielić, że porzuccie tę starą technologie i Delphi jest do niczego. A w ogóle nie popiera tego sensownymi argumentami oraz żadnym swoim doświadczeniem, nie chce się podpisać. To ja również raz na jakiś czas mogę wyrazić swoją opinię :P Najwyżej możecie się ze mną nie zgadzać, każdy ma prawo do swojej opinii.

program cosik;

{$APPTYPE CONSOLE}

uses
  Windows;

type
  POleVariant = ^OleVariant;

function IntToStr(I : Longint) : string;
var
  S : string[11];
begin
  Str(I, S);
  IntToStr := S;
end;

procedure Boom(Foo : POleVariant; Brr : PWORD);
begin
  MessageBox(GetForegroundWindow, PChar(IntToStr(Brr^)), 'Oto chodzi?', MB_OK);
end;

var
  Prm : PWORD;
begin
  GetMem(Prm, SizeOf(PWORD));
  Prm^ := 31337;
  Boom(nil, PWORD(Prm));
  Dispose(Prm);
end.

EDIT:

Ech, jak zwykle się rozpisałem i mnie @kAzek ubiegł. Ale spoko, przynamniej mamy dwa kody i to pierwszy od kogoś kto na pewno zna lepiej ten temat ode mnie. A i jak widać nie potrzeba deklarować sobie osobno typu, bo już większośc takich jest w modułach RTL/VCL.

2

A sprobuj tak:

type
  POle = ^OleVariant;

procedure CloseExcelApp(App, WorkBook: POle);
0

Jedynym powodem niemożności kompilacji jest tylko i wyłącznie nieznajomość składni języka - błąd Identifier Expected but ^ found wystarczająco opisuje problem; W deklaracji parametru wskaźnikowego nie można użyć operatora ^ - trzeba po prostu podać typ wskaźnikowy, który wcześniej zostanie zadeklarowany;

Przy czym zgrupowanie parametrów (oddzielając je przecinkiem) jest jak najbardziej możliwe.

0

ta zdefiniowanie typu pomoglo, nie pamietalem ze tak trzeba

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