LoTiles[pj, pii]:=TPngobject.Create();
LoTiles[pj, pii]:=NoImage;
LoTiles[pj, pii]
, а потом в эту же переменную записываете ссылку на объект NoImage. Во-первых это явно не то, что вы хотите, а во вторых теряется ссылка на созданный ранее объект и вы его уже не освободите (считай утечка памяти). for i := Length(source) downto 1 do
begin
if source[i] = '/' then Insert(sLineBreak, source, i+3);
end;
procedure GetDriveLetters(AList: TStrings);
var
vDrivesSize : Cardinal;
vDrives : array[0..128] of Char;
vDrive : PChar;
begin
AList.BeginUpdate;
try
AList.Clear;
vDrivesSize := GetLogicalDriveStrings(SizeOf(vDrives), vDrives);
if vDrivesSize = 0 then Exit;
vDrive := vDrives;
while vDrive^ <> #0 do
begin
AList.Add(StrPas(vDrive));
Inc(vDrive, SizeOf(vDrive));
end;
finally
AList.EndUpdate;
end;
end;
function FindFolderOnDrives(sFolderName : String):string;
var
i : Integer;
lDrivers : TStringList;
sFolderPath : String;
begin
Result := '';
lDrivers := TStringList.Create;
try
GetDriveLetters(lDrivers);
for i := 0 to lDrivers.Count - 1 do
begin
sFolderPath := lDrivers[i] + sFolderName;
if DirectoryExists(sFolderPath) then
begin
Result := sFolderPath;
Exit;
end;
end;
finally
lDrivers.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := FindFolderOnDrives('ASDFG');
end;
type
TDiskExtent = record
DiskNumber: Cardinal;
StartingOffset: Int64;
ExtentLength: Int64;
end;
TVolumeDiskExtents = record
NumberOfDiskExtents: Cardinal;
Extents: array[0..0] of TDiskExtent;
end;
PVolumeDiskExtents = ^TVolumeDiskExtents;
...
const
METHOD_BUFFERED = 0;
FILE_ANY_ACCESS = 0;
IOCTL_VOLUME_BASE = DWORD('V');
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = ((IOCTL_VOLUME_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or (0 shl 2) or METHOD_BUFFERED);
...
function GetLD(Drive: Char):Cardinal;
var
Buffer : String;
begin
Buffer := Format('\\.\%s:', [Drive]);
Result := CreateFile(PChar(Buffer), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
end;
function GetPhysicalDiskNumber(Drive: Char):Byte;
var
LD : DWORD;
DiskExtents : PVolumeDiskExtents;
DiskExtent : TDiskExtent;
BytesReturned : Cardinal;
begin
Result := MAXBYTE;
LD := GetLD(Drive);
if LD = INVALID_HANDLE_VALUE then exit;
try
DiskExtents := AllocMem(Max_Path);
DeviceIOControl(LD, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, nil, 0, DiskExtents, Max_Path, BytesReturned, nil);
if DiskExtents^.NumberOfDiskExtents > 0 then
begin
DiskExtent := DiskExtents^.Extents[0];
Result := DiskExtent.DiskNumber;
end;
finally
CloseHandle(LD);
end;
end;