Ответы пользователя по тегу Delphi
  • Как решить проблему с отрисовкой картографии?

    xpert13
    @xpert13
    Full Stack Developer
    Вам бы подучить немного Делфи не помешал. Бегло посмотрел код и увидел большое количество неправильного или ошибочного написания кода. Вот например:
    LoTiles[pj, pii]:=TPngobject.Create();
    LoTiles[pj, pii]:=NoImage;

    В этом куске вы сначала создаёте новый объект, записываете его ссылку в переменную LoTiles[pj, pii], а потом в эту же переменную записываете ссылку на объект NoImage. Во-первых это явно не то, что вы хотите, а во вторых теряется ссылка на созданный ранее объект и вы его уже не освободите (считай утечка памяти).
    Ответ написан
    Комментировать
  • Как загрузить юникод в Delphi?

    xpert13
    @xpert13
    Full Stack Developer
    Это не Юникод символ, это символ с кодом 0. Во многих языках программирования этот символ обозначает конец строки. На сколько я помню, для Delphi этот символ не помеха, но при попытке вывести содержимое TStringList в какой-то контрол (Memo например), то обрезание будет как раз на этом символе.

    Посмотрите через дебагер какое содержимое у TStringList после загрузки файла. Если там есть весь файл - тогда вам нужно просто удалить этот символ, если же нет - тогда загружать файл вам необходимо будет через TFileStream, после чего опять таки удалять этот NULL и дальше передавать куда нужно.
    Ответ написан
    Комментировать
  • Как перезапустить TChromium?

    xpert13
    @xpert13
    Full Stack Developer
    Спроси на форуме https://www.briskbard.com/forum/viewforum.php?f=8&...

    Разработчик там всем всегда помогает.
    Ответ написан
  • Как добавить перенос на новую строку?

    xpert13
    @xpert13
    Full Stack Developer
    Всё очень просто - вы постоянно добавляете новые символы и тем самым увеличиваете длину строки, но цикл крутится до окончания исходной строки. Лучше всего будет сделать обратный цикл:
    for i := Length(source) downto 1 do
    begin
      if source[i] = '/' then Insert(sLineBreak, source, i+3);
    end;


    P.S. В делфи, в нулевом индексе String находится размер массива, а сами символы находятся начиная с индекса 1.
    Ответ написан
    3 комментария
  • Как разделить строку TStringlist без цикла?

    xpert13
    @xpert13
    Full Stack Developer
    Какая задача - такое и решение:

    procedure someProcedure();
    var
      s1, s2 : TStringList;
    begin
      s1 := TStringList.Create;
      s2 := TStringList.Create;
      try
        s1.LineBreak := ' ';
        s1.Text := 'Hello world!';
        s2.Text := s1.Strings[0];
        ShowMessage(s2.Text);
      finally
        s1.Free;
        s2.Free;
      end;
    end;
    Ответ написан
  • Delphi, как найти папку на всех дисках в системе?

    xpert13
    @xpert13
    Full Stack Developer
    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;
    Ответ написан
    1 комментарий
  • Delphi. Как Узнать номер диска по его букве?

    xpert13
    @xpert13
    Full Stack Developer
    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;


    Источник: https://www.experts-exchange.com/questions/2413489... (я код немного подправил)
    Ответ написан