На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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) Если выберешь вариант (б), обнуляй массив перед каждым заполнением.
                      Сенкс! Нашел ошибку. Закрывайте тему.
                        Сам и закрывай)
                          navodri, используй динамический массив (см. выше строку кода от MBo) и используй с ним SetLength, High и пр.
                          Это гораздо лучше, чем забивать стек массивом и потом копировать его с одного места на другое.
                          К тому же, SetLength обнуляет выделенные элементы массива – ещё один плюс.
                          А если ты создаёшь динамический массив как локальную переменную в вызывающей процедуре:
                          ExpandedWrap disabled
                            procedure Example;
                            var RestorePoints: TRestorePoints;
                            begin
                              . . .
                              RestorePoints := TRestoreViewer.GetRestorePoints;
                              . . .
                            end;
                          то потом этот массив уничтожается автоматически при выходе из процедуры (т.е. не надо будет писать SetLength(RestorePoints, 0)).
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0371 ]   [ 16 queries used ]   [ Generated: 28.03.24, 14:24 GMT ]