Ответы пользователя по тегу Delphi
  • Как в DelphiВытащить выделенную запись из DBgrid?

    @M_PRO
    Если делать ровно то, что Вы просите:

    var
      DataSet: TDataSet;
    begin
      DataSet := MyDBGrid.DataSource.DataSet;
      for Index := 0 to DataSet.FieldCount - 1 do
      begin
        MyMemo.Lines.Add(DataSet.Fields[Index].FieldName + ': ' + DataSet.Fields[Index].AsString);
      end;
    Ответ написан
    Комментировать
  • Как вызвать метод предка в методе предка?

    @M_PRO
    На сколько я понял есть:
    TMyObject = class(TObject)
      procedure DoA; virtual;
      procedure DoB; virtual;
    end;
    
    TMyObject2 = class(TMyObject)
      procedure DoA; override;
      procedure DoB; override;
    end;
    
    ...
    
    TMyObject.DoA;
    begin
       DoB;
    end;
    
    TMyObject.DoB;
    begin
      WrtieLn('MyObject');
    end;
    
    TMyObject2.DoA;
    begin
       inherited DoA; // fix
    end;
    
    TMyObject2.DoB;
    begin
      WriteLn('MyObject2');
    end;


    И вы ожидаете получить в результате вызова метода DoA класса TMyObject2, исправив строку с пометкой fix
    строку MyObject в консоли строку MyObject вместо MyObject2.

    Ответ: это не возможно.

    Решение:
    1. Если классы написаны Вами - думать над проектированием.
    2. Если классы написаны не Вами - думать о том, как их использовать. Возможно "патчить" исходники если совсем припёрло. В таком случае нужна существенно более подробная информация.
    Ответ написан
    2 комментария
  • Разные результаты шифрования AES

    @M_PRO
    Очевидно, это проблема. Такого поведения быть не должно.
    Скорее всего в какой-то из функций Вы используете не инициализированную переменную.
    Если судить по Вашему описанию, текст расшифровывается корректно. Значит дело в функции KeyExpansion или инициализации массива ключа. Попробуйте вставить что-то типа

    for Index := Low(Key) to Hi(Key) do
        Key[Index] := 0;


    перед строчками

    for i:=1 to Nk*4 do
      key[i]:=Ord(s[i]);
    Ответ написан
    Комментировать
  • Очищение памяти, занимаемой свойствами класса, при закрытии формы?

    @M_PRO
    1. МС - не инициализирован.
    То есть где-то ещё должно появиться:
    MC := MainClass.Create;
    В противном случае поведение программы не предсказуемо.

    2. Никакого авто-удаления тут не будет. Если Вы в явном виде не удалили TStringList-ы, они так и останутся в памяти (что логично, потому что, например, Вы могли передать их в другие объекты). Отсюда следует, что FList типа TStringItemList (который по сути своей динамический массив) и все строки который в них хранятся останутся в памяти на веки вечные.

    3. Если Вам интересно есть ли Вашей программе утечки памяти воспользуйтесь
    reportmemoryleaksonshutdown := true;
    Про подробности подскажет Google.

    4. Про реализацию с глобальным классом - я не совсем понял технику, но выглядит она очень спорной.

    5. MC.Destroy - лучше заменить на FreeAndNil(MC), но всё равно, нужно написать
    TMainClass = class(TObject)
      ...
      destructor Destroy; override;
    end;
    
    ...
    
    destructor TMainClass.Destroy;
    begin
      MyStrings.Free;
    end;


    6. Создание подобъекта процедурой CreateMyClass лучше перенести в конструктов "главного класса".
    Ответ написан
  • Как работать со строками и символами в delphi 2010?

    @M_PRO
    for Index := 0 to Memo1.Count - 1 do
    begin
      S := Memo1.Lines[Index];
      for Index2 := Lenght(S) downto 1 do
        if {} S[Index2]  = ' ' then
          break;
      for Index3 := Lenght(s) downto 1 do
       if S[Index] <> '|' then Break;
      S := Copy(S, Index2, Index3 - Index2);
      if S <> '' then
       Memo2.Add(S);
    
    end;


    комментарий:
    цикл по каждой строке. находим начало и конец артикула. вырезаем из строки артикул. получаем то, что хотели.
    P.S. я бы использовал регулярные выражения, но комментарии будут слишком объёмными.
    Ответ написан
  • Delphi xe5. Как установить GLScene?

    @M_PRO
    ...
    uses
    FMX.Controls,
    FMX.Graphics;
    ...
    TGLSceneViewport = class(FMX.Controls.TControl)
    ...
    FFMXBuffer: FMX.Graphics.TBitmap;
    ...
    Ответ написан
  • Как парсить ссылки в алфавитном порядке на Delphi?

    @M_PRO
    var
    StringList: TStringList;
    ...
    begin
    ...
    StringList:= TStringList.Create;
    try
    ...
    ...
    StringList.Sort; // вот она ключевая строчка!
    finally
    StringList.Free;
    end;
    end;
    Ответ написан
    Комментировать
  • С помощью какого API можно получить доступ к адресам, дорогам, домам и т.д., чтобы затем работать с ними?

    @M_PRO
    Если нужно работать именно с картами, то дорога скорее всего в OSM.
    С другой стороны, возможно лучне воспользоваться готовыми базами, например ФИАС (или ФИАС в формате Кладр).
    Ответ написан
    Комментировать
  • Как оптимизировать обработку длинных циклов?

    @M_PRO
    Вариант 1 - вставить ProgressBar, Application.ProcesMessages, курсор - часики.
    Вариант 2 - не использовать IndexOf в таком контексте.

    Псевдокод:
    List1.Sorted := True;
    List2.Sorted := True;
    Index1 := 0;
    Index2 := 0;
    while (Index1 < List1.Count - 1) and (Index2 < List1.Count - 1) do
    begin
       Cmp := CompareStrings(List1[Index1],
                                             List2[Index2]);
       if Cmp = 0 then Inc(Index1);
       if Cmp > 0 then Inc(Index2);
       if Cmp < 0 then 
       begin
          List3.Add(List1[Index1]);
          Inc(Index1);
       end;
    end;


    Будет проще и быстрее хэшей.
    Ответ написан
    Комментировать
  • Как в Delphi сохранять данные в типизированный файл, а также считывать информацию из него?

    @M_PRO
    А зачем постоянно делать Seek? Кстати записи с 0 нумеруются.
    Если память не изменяет при работе с записями Rewrite принимает два значения.
    Если есть заголовки тогда
    for i:=1 to StringGrid1.RowCount - 1 do
    В чтении вообще непонятно что написано.
    Там два цикла. И в одном из них попытка модифицировать ограничение счётчика (кстати работать скорее всего тоже не будет). То есть если у нас в файле 10 записей, первым проходом мы считаем одну, вторым - две, и.т.д., до 11 прохода, когда мы попробуем считать 11 записей, то есть больше чем есть в файле.

    Я бы рекомендовал посмотреть чужие примеры.
    Ответ написан