На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Лютая проблема с типом Variant в Rad Studio Berlin 10.1
    Всем хай! Сходу к делу!
    Есть КОНСОЛЬНОЕ приложение в ДЕЛЬФИ 7, в котором сортируется динамический одномерный массив типа данных variant:
    ExpandedWrap disabled
      type
        TVector = array of variant;
      // сортировка вставками
      procedure InsertSort(pv: TVector);
      var
        i, j: word;
        tmp: variant;
      begin
        for i := 1 to high(pv) do
        begin
          writeln('i = ', i);
          tmp := pv[i];
          j := i;
          while((j > 0) and (tmp < pv[j - 1])) do  // ВНИМАНИЕ! тип данных приводить НЕ НУЖНО, сам дельф все понимает...
          begin
            pv[j] := pv[j - 1];
            j := j - 1;
          end;
          pv[j] := tmp;
        end;
      end;


    Решил сделать то же самое под Windows Forms на Дельфи Берлин в Рад студии и получал массу проблем
    1) сортировка сразу перестала работать. Как я понял, чтобы сравнение было ЧИСЕЛ, нужно писать так:
    ExpandedWrap disabled
      StrToInt(VarToStr(tmp)) < ...
    и вроде для чисел заработало
    2) для сортировки строк НИКАК не получается настроить.
    перебровал:
    1. VarToStr - не работает
    2. VarToWideStr - не работает
    3. Через CompareStr - неработает
    4. Через AnsiCompareStr - не работает

    и постоянно одна и та же ошибка (см. прил. файл)
    Прикреплённый файлПрикреплённый файлVariant.png (39,02 Кбайт, скачиваний: 485)

    т е в консольном дельфи 7 все работало ШИКАРНО без единого кастования в тип данных, а в РАД СТУДИИ БЕРЛИН 10.1 строки не получается настроить.

    подскажите, как быть то?
      И тебе ХАЙ! Насчёт Берлина (и где ты его снял) - не в курсе. Но у любого VARIANT есть нюансы типа AsInt, AsString... Сорри , я щяс на даче, все возможности Дельфи Берлин в Рад студии мне недоступны.
        Цитата FasterHarder @
        для сортировки строк НИКАК не получается настроить.

        А как ты вызываешь для сортировки строк на D7?
          Цитата ^D^ima @
          D7?

          в смысле? D7 - ячейка в шахматах!
          или ты про запуска приложения из студии? Если да, то я кликаю по зелененькой стрелочке)) и прожка компилится, а потом запускается

          я считаю, что дело в НАСТРОЙКАХ среды РАД СТУДИИ, КОМПИЛЛЕРА и еще чего, т к В ДЕЛЬФИ 7.0 все работает лучше, чем прекрасно...

          Добавлено
          Среди всех дельфи, самая лучшая и стабильная версия 7.0?
          да/нет...
            Цитата FasterHarder @
            в смысле? D7 - ячейка в шахматах!

            именно!

            У меня все работает что в 7-ке, что в 10 берлине. Я поэтому и пишу, приведи код целиком
              Цитата ^D^ima @
              приведи код целиком

              так, ээээ вот он выше и есть....
              ExpandedWrap disabled
                    type
                      TVector = array of variant;
                    // сортировка вставками
                    procedure InsertSort(pv: TVector);
                    var
                      i, j: word;
                      tmp: variant;
                    begin
                      for i := 1 to high(pv) do
                      begin
                        //writeln('i = ', i);
                        tmp := pv[i];
                        j := i;
                        while((j > 0) and (tmp < pv[j - 1])) do  // РАД СТУДИЯ тут начинает материться непонятно из-за чего..
                        begin
                          pv[j] := pv[j - 1];
                          j := j - 1;
                        end;
                        pv[j] := tmp;
                      end;
                    end;

              я проверял, что до вызова сортировки данные правильно заносятся в вектор, поэтому проблема именно внутрях сортира InsertSort(

              что делать?...

              Добавлено
              и в конце сортировку разбил на две части:

              ExpandedWrap disabled
                // pflag: 0 - integer; 1 - string
                procedure InsertSort(pv: TVector; pflag: byte);
                    var
                      i, j: word;
                      tmp: variant;
                    begin
                      for i := 1 to high(pv) do
                      begin
                        tmp := pv[i];
                        j := i;
                        if(pflag = 0) then  // sorting as integer
                          while((j > 0) and (StrToInt(VarToStr(tmp)) < StrToInt(VarToStr(pv[j - 1])))) do
                          begin
                            pv[j] := pv[j - 1];
                            j := j - 1;
                          end
                        else   // sorting as string
                        begin
                          while((j > 0) and (VarToStr(tmp) < VarToStr(pv[j - 1]))) do
                          begin
                            pv[j] := pv[j - 1];
                            j := j - 1;
                          end;
                        end;
                        pv[j] := tmp;
                      end;
                    end;


              целые сортирует идеально, но строках RUN TIME ERROR!!
                System.Variants.VarCompareValue

                ?
                  Цитата Chow @
                  System.Variants.VarCompareValue

                  так, а что является результатом этой функции?
                  т е писать нужно так:
                  ExpandedWrap disabled
                    while((j > 0) and (System.Variant.varCompareVal(tmp, pv[j - 1]) ????) do


                  посмотрел справку, там тип лютый
                  ExpandedWrap disabled
                    TVariantRelationship
                  , т е это не целое число...
                    Цитата FasterHarder @
                    так, ээээ вот он выше и есть....

                    Код перед вызовом самой процедуры.

                    Ещё раз - у меня без модификации на 10 берлине твой код работает. Для чисел и для строк
                      Цитата FasterHarder @
                      посмотрел справку, там тип лютый
                      ExpandedWrap disabled
                        TVariantRelationship
                      , т е это не целое число...

                      Обычное перечисление. Какие проблемы?
                      ExpandedWrap disabled
                        TVariantRelationship = (vrEqual, vrLessThan, vrGreaterThan, vrNotEqual);
                        ChowChow, понятно, попробую, когда Берлин будет под рукой. КАк понял им соот-ют целочисленные значения, наверное...
                        Chow, а почему такое требуется в Берлине, в Дельфях 7 все прекрасно? какие-то настройки или компиллер стал СТРОЖЕ к преобразованиям?!
                          Цитата Chow @
                          System.Variants.VarCompareValue

                          ?


                          проверил - не помогло!
                            10.1, код из #1 компилится без всяких вопросов на гуй приложении.
                              Fr0sT, компилится то компилится, но работает ли?

                              У автора проблема в том, что алгоритм заточен на то, что все Варианты в массиве - чисельные (Variants.VarIsNumeric(value) - всегда true).
                              Он смело их приводит "индусским" способом (через строку) к целому (StrToInt(VarToStr(tmp)), и так их сравнивает для сортировки.

                              Но стоит лишь "закрасться" в массив значению, которое к числу не приводится - вылетает исключение.
                              Сообщение отредактировано: Chow -
                                Chow, т.к. автор не дал полностью готового кода, в работе я его естессно не проверял - мне еще обвязку для него писать, что ли?
                                Вообще код хоть и корявый, но по идее должен работать. Т.к. в любом variant содержится тип его данных, соответственно сравнение выполняется для этого типа

                                Добавлено
                                А ошибка в первом посте скорее всего потому, что какой-то из элементов числовой, а какой-то строковый
                                  Да не скорее всего - а так и есть.
                                  И то, что консольное приложение работало - просто везло с данными во входном массиве (который сортируется).
                                    Цитата Chow @
                                    целому (StrToInt(VarToStr(tmp)),

                                    в этом фрагменте никогда не возникает ошибка! сортировка целых чисел проходит на УРА!
                                    проблема, когда сортируется массив из строковых значений и только в этом случае!

                                    Добавлено
                                    и то, что проблема есть при сортировке строк и только в ней описано в 1-ом сообщении!
                                      FasterHarder, я 2 раза не повторяю,не повтряю, у меня код в первом посте работает без модификации в 7 дельфи и 10.1 берлине и для строк и для чисел
                                        Цитата ^D^ima @
                                        FasterHarder, я 2 раза не повторяю,не повтряю, у меня код в первом посте работает без модификации в 7 дельфи и 10.1 берлине и для строк и для чисел

                                        в том то и дело, что код прекрасен и прекрасно должен все сортировать!
                                        но вот строки НЕ сортирует и вылетает эта ошибка

                                        в чем же здесь дело то... хм... как же быть то... что за чертовщина происходит при обработке строк...хм...
                                        может попробовать так?

                                        Добавлено
                                        а вообще бывает такое, что какая-то чертовщина мешает коду нормально работать?
                                        т е какие-то неведомые силы оказывают влияние на выполнение (я не про кривизну рук программера)...
                                          FasterHarder так приведи пример входящих данных для проверки. А еще лучше код вызова твоей процедуры
                                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                          0 пользователей:


                                          Рейтинг@Mail.ru
                                          [ Script execution time: 0,0511 ]   [ 19 queries used ]   [ Generated: 19.04.24, 22:46 GMT ]