Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#32

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 11. Mär 2009, 09: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;
  Mit Zitat antworten Zitat