На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Как заменить SetLength?
    ExpandedWrap disabled
      function TRestoreViewer.GetRestorePoints: TRestorePoints;
      var
        ObjWMIService           : OLEVariant;
        ColItems                : OLEVariant;
        ColItem                 : OLEVariant;
        OEnum                   : IEnumvariant;
      //  IValue                  : PLongint;
        CountOfRestorePoint     : Integer;
        I: Integer;
        RestorePoint            : TRestorePoint;
      begin
        ObjWMIService := GetWMIObject('winmgmts:\\localhost\root\default');
        ColItems      := objWMIService.ExecQuery('SELECT * FROM SystemRestore','WQL',0);
        OEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
       
       if not VarIsNull(ColItems.Count) then
         CountOfRestorePoint := StrToInt(VarToStr(ColItems.Count))
       else
         CountOfRestorePoint := 0;
       if (CountOfRestorePoint = 0) then Exit;
       
      //   SetLength(Result, CountOfRestorePoint);
       
        I := 0;
       
        while OEnum.Next(1, colItem, nil {IValue}) = 0 do
        begin
          RestorePoint.Description := ColItem.Description;
          RestorePoint.EventType := EventTypeToStr(ColItem.EventType);
          RestorePoint.SequenceNumber := ColItem.SequenceNumber;
          RestorePoint.CreationTime := WMITimeToStr(ColItem.CreationTime);
          RestorePoint.RestorePointType := RestorePointTypeToStr(ColItem.RestorePointType);
       
          Result[i] := RestorePoint;
          Inc(i);
        end;
      end;
      SetLength нельзя заменить ничем, если оно применяется к переменным соответствующих типов.

      А про тип мы не знаем, т.к. не телепаты.
        Сорри. Вот тип:

        ExpandedWrap disabled
          type
            TRestorePoint = record
              Description:string;
              EventType:string;
              SequenceNumber:string;
              CreationTime:string;
              RestorePointType:string;
            end;
           TRestorePoints = array [0..255]of TRestorePoint;
          getmem/freemem
            В моем случае Result не Pointer. Так не компилится: Incompatible types

            ExpandedWrap disabled
              GetMem(Result, sizeOf(CountOfRestorePoint));
              Массив статический, так что задавать длину ему не нужно, память под результат уже выделена компилятором.
              При этом неизвестно, сколько реально элементов заполнено

              SetLength требуется для динамических массивов

              ExpandedWrap disabled
                    TRestorePoints = array of TRestorePoint;
                Это не помогает. ListView1 заполняется множеством пустых пунктов. Может, в заполнении ошибка:


                ExpandedWrap disabled
                  procedure TForm1.Button1Click(Sender: TObject);
                  var
                   MyRestoreViewer:TRestoreViewer;
                   AllRestorePoint:TRestorePoints;
                   I: Integer;
                  begin
                   ListView1.Items.Clear;
                   
                   MyRestoreViewer := TRestoreViewer.Create;
                   AllRestorePoint := MyRestoreViewer.GetRestorePoints;
                   
                   for I := 0 to High(AllRestorePoint) do
                    with ListView1.Items.Add do
                    begin
                      Caption := AllRestorePoint[i].Description;
                      SubItems.Add(AllRestorePoint[i].EventType);
                      SubItems.Add(AllRestorePoint[i].SequenceNumber);
                      SubItems.Add(AllRestorePoint[i].RestorePointType);
                      SubItems.Add(AllRestorePoint[i].CreationTime);
                    end;
                   
                   MyRestoreViewer.Free;
                   
                  end;
                  А длина динамического массива установлена в соответствии с реальным содержанием? Если используется код из первого поста, то i после цикла содержит счётчик записей.
                    1) Поставь точку останова после заполнения массива и посмотри в отладчике, что туда записалось
                    2) (а) Возвращай кол-во заполненных элементов либо (б) выставляй флаг внутри записи, что она содержит данные, чтобы не рассматривать незаполненные элементы
                    3) Если выберешь вариант (б), обнуляй массив перед каждым заполнением.
                    Codero ergo sum
                    // Программирую — значит, существую
                      Сенкс! Нашел ошибку. Закрывайте тему.
                        Сам и закрывай)
                        Codero ergo sum
                        // Программирую — значит, существую
                          navodri, используй динамический массив (см. выше строку кода от MBo) и используй с ним SetLength, High и пр.
                          Это гораздо лучше, чем забивать стек массивом и потом копировать его с одного места на другое.
                          К тому же, SetLength обнуляет выделенные элементы массива – ещё один плюс.
                          А если ты создаёшь динамический массив как локальную переменную в вызывающей процедуре:
                          ExpandedWrap disabled
                            procedure Example;
                            var RestorePoints: TRestorePoints;
                            begin
                              . . .
                              RestorePoints := TRestoreViewer.GetRestorePoints;
                              . . .
                            end;
                          то потом этот массив уничтожается автоматически при выходе из процедуры (т.е. не надо будет писать SetLength(RestorePoints, 0)).
                          vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script Execution time: 0,1080 ]   [ 15 queries used ]   [ Generated: 20.10.19, 19:14 GMT ]