Code: Alles auswählen
interface
function abc(arg1, arg2: Integer): Integer; stdcall;
Code: Alles auswählen
implementation
function abc ( arg1, arg2: Integer ) : Integer;
begin
end;
Kann das jemand bestätigen?
Code: Alles auswählen
interface
function abc(arg1, arg2: Integer): Integer; stdcall;
Code: Alles auswählen
implementation
function abc ( arg1, arg2: Integer ) : Integer;
begin
end;
Nach der FreePascal-ReferenzRSE hat geschrieben:Ist es im Implementation-Abschnitt überhaupt erlaubt?
berichtigtRSE hat geschrieben:beim 2. Argument aus arb2 plötzlich arg2 geworden ist[...]
Genau da hab ich sie ja hingeschrieben. In der FreePascal-Referenz hab ich nicht mehr als du darüber gefunden.Euklid hat geschrieben:gehören diese Aufrufkonventionen hinter die Deklaration der Funktion/Prozedur.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
function test(arg1, arg2: Integer): Integer; stdcall;
implementation
function test ( arg1, arg2: Integer ) : Integer;
begin
end;
end.
Daraus schließe ich, dass sie erforderlich sind und nicht einfach ignoriert werdenUnit1.pp(11,10) Error: Calling convention doesn't match forward
Unit1.pp(7,10) Hint: Found declaration: test(LongInt, LongInt):LongInt;StdCall
Code: Alles auswählen
property TestItem[index:Integer]:Boolean index 0 read GetTestItem write SettTestItem
Code: Alles auswählen
// aus
TMyClas = class
private
public
property test[Index: Integer]: Integer index 0 read GetInt write SetInt;
end;
// wird
TMyClas = class
private
function GetInt ( AIndex: integer; Index: Integer ) : Integer;
procedure SetInt ( AIndex: integer; Index: Integer; const AValue: Integer
) ;
public
property test[Index: Integer]: Integer index 0 read GetInt write SetInt;
end;
Das erste "index" ist ein einfacher Bezeichner, kann also geändert werden, während der zweite ein Sschlüsselwort ist und nicht geändert werden kann. Also gehe ich davon aus, dass in meinem Beispiel oben das AIndex dem Index der Array-Eigenschaft entspricht (also das Index in den eckigen Klammern).pluto hat geschrieben:Das könnte aber auch an mir liegen da ich ja ein index ändern könnte.... sehe ich das richtig ?
Das wird sehr, sehr viel aufwand, da du überprüfen musst, ob dieser oder jener Parameter schon irgendwo deklariert ist....pluto hat geschrieben: Aber auch die Code-Tools könnten ja drauf achten, und die Parameter entsprechend ändern !
Ich hoffe du meinst mein Beispiel zum CodeCompletion von Array-Eigenschaftenpluto hat geschrieben:Ja genauso war es bei mir auch gestern.
aus "index" und "index" wird "AIndex" und "Index". Wurde da etwas umbenannt? Ich glaube schon.pluto hat geschrieben:könnten die doch ein Index umbenennen
Code: Alles auswählen
property ViewHPenLeft[index:Integer]:Boolean index 0 read GetView write SetView;
property ViewHPenTop[index:Integer]:Boolean index 1 read GetView write SetView;
property ViewHPenRight[index:Integer]:Boolean index 2 read GetView write SetView;
property ViewHPenBottom[index:Integer]:Boolean index 3 read GetView write SetView;
property ViewHPen[index:Integer]:Boolean index 4 read GetView write SetView;
property PenHLeft[index:Integer]:TMyPen index 0 read GetPen write SenPen;
property PenHTop[index:Integer]:TMyPen index 1 read GetPen write SenPen;
property PenHRight[index:Integer]:TMyPen index 2 read GetPen write SenPen;
property PenHBottom[index:Integer]:TMyPen index 3 read GetPen write SenPen;
property PenH[index:Integer]:TMyPen index 4 read GetPen write SenPen;
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
{ Beide Funktionsdeklarationen sind identisch (Name ausgenommen) }
function CompiliertNicht(arg1, arg2: Integer): Integer; stdcall;
function CompiliertDoch(arg1, arg2: Integer): Integer; stdcall;
implementation
function CompiliertNicht ( arg1, arg2: Integer ) : Integer;
{ Das hier wird durch CodeCompletion erzeugt. Der Aufrufmodifizierer (deutsch für
calling modifier) wurde nicht übertragen. Hier gibt der Compiler einen Fehler
und einen Hinweis aus:
Unit1.pp(13,10) Error: Calling convention doesn't match forward
Unit1.pp(7,12) Hint: Found declaration: CompiliertNicht(LongInt, LongInt):LongInt;StdCall
}
begin
Result := arg1+arg2;
end;
function CompiliertDoch ( arg1, arg2: Integer ) : Integer; stdcall;
{ Hier habe ich stdcall; manuell hinzugefügt. Es treten keine Fehler auf. }
begin
Result := arg1+arg2;
end;
end.
Nicht nur evtl. aber die Code-Completion-Funktion von Lazarus fügt die Aufrufkonvention nur bei cdecl hinzu. (Ich suche eine Bestätigung des Fehlers für einen Bug-Tracker-Eintrag)pluto hat geschrieben:EVLT: muss du stdcall; auch unten wo die Funktion erstellt wird hinschreiben...
Wie ?vielleicht ist statt View* Display* oder Show* besser (ich denke nicht, dass dein Objekt deine Stifte (pen) anguckt)