Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
Delphi 12 Athens
|
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
11. Mär 2009, 10:48
Das könnte so aussehen:
Delphi-Quellcode:
procedure MoveElements(var Source, Dest; ASize: DWord);
var
BufferSize: DWord;
Buffer, P1, P2: Pointer;
begin
P1 := @Dest;
P2 := @Source;
if DWord(@Source) < DWord(@Dest) then
begin
BufferSize := DWord(@Dest) - DWord(@Source);
if BufferSize > ASize then
BufferSize := ASize
else
Inc(DWord(P1), ASize - BufferSize);
end
else if DWord(@Source) > DWord(@Dest) then
begin
BufferSize := DWord(@Source) - DWord(@Dest);
if BufferSize > ASize then
BufferSize := ASize
else
Inc(DWord(P2), ASize - BufferSize);
end
else
Exit;
GetMem(Buffer, BufferSize);
Move(P1^, Buffer^, BufferSize);
Move(Source, Dest, ASize);
Move(Buffer^, P2^, BufferSize);
FreeMem(Buffer);
end;
procedure TMainList.MoveContent(const AFrom, ATo, ASize: Integer);
begin
MoveElements(FValues[AFrom], FValues[ATo], ASize);
end;
Die Grenzen des Arrays dürfen durch ASize natürlich nicht überschritten werden.
Deshalb würde ich MoveContent so ändern, dass ACount übergeben wird.
Delphi-Quellcode:
procedure TMainList.MoveContent( const AFrom, ATo, ACount: DWord);
begin
{$ifdef DEBUG}
if (AFrom + ACount > Length(FValues)) or
(ATo + ACount > Length(FValues)) then
raise Exception.Create(' MoveContent -> Index überschreitet das Maximum');
{$endif}
MoveElements(FValues[AFrom], FValues[ATo], ACount * SizeOf(FValues[0]));
end;
|
|
Zitat
|