Конференция "KOL" » Передача из listview модальной формы в listview не модальную [Kol]
 
  • psih © (14.03.12 21:03) [0]
    Всем привет. Не могу разобраться как это сделать. И форум перерыл, и в googl'e искал и даже в koll.pas смотрел-ненашёл. В delphi vcl такое делалось так

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if Form5.ModalResult=mrOk then
    Form2.ListView1.Items.Assign(lvClas.Items)
    else
    if Form5.ModalResult=mrCancel then
    Form2.ListView1.Items.Assign(lvClas.Items)
    end;


    А как такое сделать в kol? Просто я уже и все значения по поиску item в ресурсах kol.pas перебрал ничего не подходит под компиляцию:(
  • Vladimir Kladov © (17.03.12 09:46) [1]
    Никак. Только цикл по колонкам, и добавление элементов во второй список, с копированием всех колонок из элемента в первом (вложенный цикл). Assign в VCL именно это и делает.
  • psih © (17.03.12 11:40) [2]
    Если так, то у меня есть пример сохранения инфы в PStrList

    var i,j:integer;
       S:PStrList;
       S1:String;
    begin
    ///
     begin

       S:=NewStrList;

       try
         for i:=0 to LV.LVCount-1 do
         begin
          S1:='';
          for j:=0 to LV.LVColCount-1 do
            S1:=S1+LV.LVItems[i,j]+';';
          S.Add(S1);
         end;
         ////
       finally
       ///
       end;

     end;
    end;



    а как загрузить то обратно?
  • psih © (19.03.12 21:00) [3]
    Я уже не знаю как передать данные. Код

    var i,j:integer;
       S:PStrList;
       S1:String;
    begin
     NewForm2( Form2, Applet );
     Form2.Form.ShowModal;
    begin
         for i:=0 to Form2.LV.LVCount-1 do
         begin
          S1:='';
          for j:=0 to Form2.LV.LVColCount-1 do
            Form1.ListView1.LVItems[i,j]:=Form2.LV.LVItems[i,j];


    Куда уже не подстовлял и как только не минял, всё бестолку. Владимир Кладов ну подскажите освающему kol mck как тут быть
  • rdnks (21.03.12 03:20) [4]
    первое что бросилось в глаза - в вашем коде обработка LV идет после фактического уничтожения модальной формы, то есть после
    .ShowModal
    А, как понял, должно быть после создании формы. То есть надо вставлять обработку до ShowModal. И зачем столько синтаксических контейнеров? Или это куски когда так выданы странно..
    И рекомендуют в целях оптимизации
    For i:=0 to bla-bla.Count - 1 do
    Заменять
    y := bla-bla.Count - 1;
    For i:=0 to y do
  • Дмитрий К © (21.03.12 12:43) [5]

    > И рекомендуют в целях оптимизации
    > For i:=0 to bla-bla.Count - 1 do
    > Заменять
    > y := bla-bla.Count - 1;
    > For i:=0 to y do

    Не один раз, и на этом форуме в том числе, обсуждалось, что границы цикла for... to вычисляются один раз, поэтому смысла нет в такой оптимизации.


    > psih ©  

    Пусть Form1 - главная форма, Form2 - модальная, на каждой - ListView с одинаковым количеством колонок. В обработчике OnClose Form2 пишешь примерно следующее:
    var i, j, ii: Integer;
    begin
     for i := 0 to ListView1.LVCount - 1 do
     begin
       ii := Form1.ListView1.LVItemAdd(ListView1.Items[i, 0]);
       for j := 1 to ListView1.LVColCount - 1 do
         Form1.ListView1.LVItems[ii, j] :=  ListView1.Items[i, j]
     end;
    end;

  • rdnks (21.03.12 15:46) [6]
    пример
    type
     TSample = object
     function fGetCount: integer;
     procedure fSetCount(const val: integer);
     property Count: integer read fGetCount write fSetCount;
     end;

    function TSample.fGetCount: integer;
    begin
    {специфичный код получения количества элементов}
    end;

    procedure TSample.fSetCount(const val: integer)
    begin
    {специфичный код установки количества элементов}
    end;

    Вывод - если пределы цикла расчитываются один раз в первую интерацию цикла - это серьезный баг компилятора, так как значение в объекте может быть изменено в теле цикла. Подобного не наблюдал.
  • Дмитрий К © (21.03.12 16:03) [7]
    Это не баг, это фича. Если нужно учитывать изменение значения, используют цикл while.
  • rdnks (21.03.12 16:19) [8]
    ну я спорить не буду, компилятор дельфи оптимизирует такие участки сам, читал статьи, но вот только к объектам это не относится, аналогичная ситуация в gcc для c. Желательно значения такие расчитывать заранее, так как машина в отличии от человека не обладает экстрасенсорными способностями и поведение того же самого компилятора должно быть предугадываемым, или как лучше выразится..
  • Mr (21.03.12 16:24) [9]
    Все именно так как написал Дмитрий К. Причем описано в документации.
    Хотя с точки зрения читабельности кода - я бы это фичей называть не стал.
  • rdnks (21.03.12 16:36) [10]
    вот написал пример в bds2006 и прогнал в дебагере, при каждой интераци расчитывает значение fGetCount. Вечером прогоню в иде, но поведение такое как описал, и оно правильное.
  • psih © (21.03.12 20:51) [11]
    не хачу показаться дураком, но у меня вылетает ошибка о том что параметров передаю больше чем есть, хотя колличество колонок одинаковое

    ii := Form1.ListView1.LVItemAdd(ListView1.Items[i, 0]);//Too many actual parameters

  • psih © (21.03.12 21:23) [12]
    Чё та в натуре тупанул, нада была так

      ii := Form1.ListView1.LVItemAdd(ListView1.LVItems[i, 0]);
      for j := 1 to ListView1.LVColCount - 1 do
        Form1.ListView1.LVItems[ii, j] :=  ListView1.LVItems[i, j]

  • Mr (22.03.12 08:43) [13]

    > вот написал пример в bds2006 и прогнал в дебагере, при каждой
    > интераци расчитывает значение fGetCount. Вечером прогоню
    > в иде, но поведение такое как описал, и оно правильное.

    Вполне возможно, что они одумались и исправили "фичу" - но в 7-й это еще так. Общение с более новыми версиями заканчивал установкой-просмотром-сносом, да и с 7-кой работаю только над поддержкой старых проектов. Для новых проектов пока решения от мелкомягких рулят, а какие были времена...
 
Конференция "KOL" » Передача из listview модальной формы в listview не модальную [Kol]
Есть новые Нет новых   [118670   +55][b:0][p:0.002]