Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#15

Re: Array , Löschen von selben verhindern.

  Alt 28. Okt 2006, 18:33
Hallo Emil,

Delphi-Quellcode:
// Voller Pfad des Plugin
FileName := StrPas(f);
das muss nicht sein. In der Regel weiß Delphi zwischen PChar und String automatisch zu konvertieren.

if not FileExists(PChar(FileName)) then f oder FileName genügt - kein casting nötig.

Delphi-Quellcode:
if VisCounter = 0 then
 VisWinCounter := VisCounter;
das ist nicht verständlich - auch weil du so viele globale Variablen benutzt.

Delphi-Quellcode:
  try
    GetMem(VisInfo[VisCounter], SizeOf(TWinampVisInfo));
    ZeroMemory(VisInfo[VisCounter], SizeOf(TWinampVisInfo));
  except
    BassFuncs^.SetError(BASS_ERROR_MEM);
    Exit;
  end;
Wenn VisInfo als statisches Array deklariert ist (siehe Beitrag #1), dann greift der Code hier bei VisCounter = 0 ins Leere.
Kannst du nicht ein dynamisches Array verwenden?

Delphi-Quellcode:
type
  TVisInfo = array of PWinampVisInfo;
var
  VisInfo: TVisInfo;

function AddVisInfo(var vi: TVisInfo): TVisInfo;
begin
  index := Length(vi);
  SetLength(vi, Succ(index));
  New(vi[index]); // Freigabe mit Dispose(vi[index]) - Borland empfiehlt es
  ZeroMemory(vi[index], SizeOf(vi[index]^));
end;

procedure DeleteVisInfo(var vi: TVisInfo; p: PWinampVisInfo);
var
  index, iFound: Integer;
begin
  // locate pointer
  iFound := -1; // not found
  for index := Low(vi) to Length(vi) do
    if (index < Length(vi)) and (vi[index] = p) then
    begin
      iFound := index;
      Break;
    end;

  if iFound <> -1 then
  // fill the gap
  begin
    Dispose(vi[index]);
    if index <> High(vi) then
      vi[index] := vi[High(vi)];
    SetLength(vi, High(vi));
  end;
end;
An die Stelle der globalen Variable VisCounter könnte dann Length(VisInfo) treten. Wenn du ein statisches Array benutzen musst, dann müsstest du aber ähnlich vorgehen.

Delphi-Quellcode:
// ...
    // SetCurrentDirectory(PChar(FileName));
    // vielleicht besser so:
    SetCurrentDirectory(ExtractFilePath(f));
Jetzt muss ich erstmal eine Pause machen - deine Probleme sind immer so umfangreich...

Freundliche Grüße
  Mit Zitat antworten Zitat