Jump to content

How to create progressbar in realtime


fil

Recommended Posts

Hi,

 

Unigui installation includes ShowProgress demo

But this demo does not work for me in the following code. When using the UniSession.Synchronize function.

 

function TMainForm.CreateFields():boolean;
var
 i,perRecords:integer;
 perIBQuery,perIBQuery2:TIBQuery;

begin
//получаем список всех описаний  спейсов
UniMainModule.IBDatabase.Connected:=true;
perIBQuery:=UniMainModule.MyInitializationTIBQerySelect(perIBQuery);
perIBQuery.Active:=false;
perIBQuery.SQL.Clear;
perIBQuery.SQL.Add('select DESCRIPTION from SPACES group by DESCRIPTION' );
perIBQuery.Active:=true;

perIBQuery2:=UniMainModule.MyInitializationTIBQerySelect(perIBQuery);

perIBQuery.Last;
//очищаем массив и выставляемя размер массива согласно размеру sql запросу
SetLength(ParamString,0);
SetLength(ParamString,perIBQuery.RecordCount);

perIBQuery.first;

ShowProgress('Please Wait...');   //запускаем прогрессбар
UniSession.Synchronize;

perRecords:=perIBQuery.RecordCount-1 ;
for i:=0 to perRecords do
  begin
  UpdateProgress(i/perRecords, Format('%%%d Completed', [round(100/perRecords*i)]));
  UniSession.Synchronize;

  //создаем панельку в которой будем размещать кнопки и
  ParamString[i].Panel:=TUniPanel.Create(MainForm);
  ParamString[i].Panel.Parent:= MainForm;
  ParamString[i].Panel.Left:=10;
  ParamString[i].Panel.Top:=i*30+30;
  ParamString[i].Panel.Width:=650;
  ParamString[i].Panel.Height:=25;
  ParamString[i].Panel.Name:='panel'+inttostr(i);
  ParamString[i].Panel.Visible:=false;  //скрываем чтобы быстрее грузилось

  //создаем название спейса
  ParamString[i].LabelNameSpace:=TUniLabel.Create(ParamString[i].Panel);
  ParamString[i].LabelNameSpace.Parent:=  ParamString[i].Panel;
  ParamString[i].LabelNameSpace.Left:=5;
  ParamString[i].LabelNameSpace.Top:=5;
  ParamString[i].LabelNameSpace.Width:=75;
  ParamString[i].LabelNameSpace.Height:=25;
  ParamString[i].LabelNameSpace.Caption:=TRIM(perIBQuery.fieldbyname('DESCRIPTION').asstring);
  ParamString[i].LabelNameSpace.Name:='Label'+inttostr(i);

  //выбираем все группы для спейса

  perIBQuery2.Active:=false;
  perIBQuery2.SQL.Clear;
  perIBQuery2.SQL.Add(
  'select '+
  '    spaces.id, '+
  '    spaces.description, '+
  '    spaces.name_, '+
  '    laws.id_users, '+
  '    laws1.id_users admins '+
  'from laws ' +
  '   right outer join spaces on (laws.id_spaces = spaces.id and laws.id_users = '+inttostr(gperIDuser)+') '+
  '   left outer join laws laws1 on (spaces.id = laws1.id_spaces and laws1.id_users = '+inttostr(gperIDcurentuser)+') '+
  'where '+
  '   (  '+
  '      (description =' +''''+TRIM(perIBQuery.fieldbyname('DESCRIPTION').asstring)+''''+') '+
  '   ) '
  );

  perIBQuery2.Active:=true;
  perIBQuery2.first;

  //тут рисуем кнопку none
  ParamString[i].RadioButton4:=TUniRadioButton.Create(ParamString[i].Panel);
  ParamString[i].RadioButton4.Parent:=  ParamString[i].Panel;
  ParamString[i].RadioButton4.Left:=600;
  ParamString[i].RadioButton4.Top:=2;
  ParamString[i].RadioButton4.Width:=75;
  ParamString[i].RadioButton4.Height:=25;
  ParamString[i].RadioButton4.Caption:='None';
  ParamString[i].RadioButton4.Name:='RadioButton4_'+inttostr(i);
  ParamString[i].RadioButton4.Checked:=true;
  ParamString[i].CheckedID:=-1;

  while not perIBQuery2.Eof do
    begin
    if  pos('Admin',perIBQuery2.fieldbyname('NAME_').asstring)>0 then
      begin
      ParamString[i].RadioButton1:=TUniRadioButton.Create(ParamString[i].Panel);
      ParamString[i].RadioButton1.Parent:=  ParamString[i].Panel;
      ParamString[i].RadioButton1.Left:=390;
      ParamString[i].RadioButton1.Top:=2;
      ParamString[i].RadioButton1.Width:=60;
      ParamString[i].RadioButton1.Height:=25;
      ParamString[i].RadioButton1.Caption:='Admin';
      ParamString[i].ID1:=perIBQuery2.fieldbyname('ID').AsInteger; //ЗАПИСЫВАЕМ ID СПЕЙСА КОТОРЕ ПОД ЭТОЙ КНОПКОЙ
      ParamString[i].RadioButton1.Name:=TRIM(perIBQuery2.fieldbyname('NAME_').asstring);
      if perIBQuery2.fieldbyname('id_users').AsInteger>0 then
        begin
        ParamString[i].RadioButton1.Checked:=true;  //выставляем крыжик на правах админа если он админ
        ParamString[i].CheckedID:=1;  //выставляем что админ был
        end;
      if (gperIDuser<>gperIDcurentuser)and(gperIDcurentuser<>0) then     //если залогиненый пользователь не совпадает с выбранным пользователем и не равен глобальному админу то
        begin
        if perIBQuery2.fieldbyname('admins').AsInteger>0 then ParamString[i].Panel.Enabled:=true else ParamString[i].Panel.Enabled:=false; //если это админ спейса делаем возможность выбора, если нет то нет
        end;
      end else
          if (pos('Read',perIBQuery2.fieldbyname('NAME_').asstring)>0)and(pos('ReadWrite',perIBQuery2.fieldbyname('NAME_').asstring)=0) then
            begin
            ParamString[i].RadioButton2:=TUniRadioButton.Create(ParamString[i].Panel);
            ParamString[i].RadioButton2.Parent:=  ParamString[i].Panel;
            ParamString[i].RadioButton2.Left:=450;
            ParamString[i].RadioButton2.Top:=2;
            ParamString[i].RadioButton2.Width:=75;
            ParamString[i].RadioButton2.Height:=25;
            ParamString[i].RadioButton2.Caption:='Read';
            ParamString[i].ID2:=perIBQuery2.fieldbyname('ID').AsInteger; //ЗАПИСЫВАЕМ ID СПЕЙСА КОТОРЕ ПОД ЭТОЙ КНОПКОЙ
            ParamString[i].RadioButton2.Name:=trim(perIBQuery2.fieldbyname('NAME_').asstring);
            if perIBQuery2.fieldbyname('id_users').AsInteger>0 then
              begin
              ParamString[i].RadioButton2.Checked:=true;
              ParamString[i].CheckedID:=2;  //выставляем что чтение
              end;

            end else
                if pos('ReadWrite',perIBQuery2.fieldbyname('NAME_').asstring)>0 then
                  begin
                  ParamString[i].RadioButton3:=TUniRadioButton.Create(ParamString[i].Panel);
                  ParamString[i].RadioButton3.Parent:=  ParamString[i].Panel;
                  ParamString[i].RadioButton3.Left:=510;
                  ParamString[i].RadioButton3.Top:=2;
                  ParamString[i].RadioButton3.Width:=75;
                  ParamString[i].RadioButton3.Height:=25;
                  ParamString[i].RadioButton3.Caption:='ReadWrite';
                  ParamString[i].ID3:=perIBQuery2.fieldbyname('ID').AsInteger; //ЗАПИСЫВАЕМ ID СПЕЙСА КОТОРЕ ПОД ЭТОЙ КНОПКОЙ
                  ParamString[i].RadioButton3.Name:=trim(perIBQuery2.fieldbyname('NAME_').asstring);
                  if perIBQuery2.fieldbyname('id_users').AsInteger>0 then
                    begin
                    ParamString[i].RadioButton3.Checked:=true;
                    ParamString[i].CheckedID:=3;  //выставляем что чтение и запись
                    end;
                  end;
    perIBQuery2.Next;
    end;
  perIBQuery.next;
  end;

HideProgress;     //скрываем прогрессбар
//ShowToast('Process Finished');


for i:=0 to Length(ParamString)-1 do
  begin
  ParamString[i].Panel.Visible:=true;
  end;

  perIBQuery.Free;
  perIBQuery2.Free;
end;

 

I get the error

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class Exception with message 'Fatal Error: Control can not be created  with a nil Owner.'.
---------------------------
Break   Continue   Help   
---------------------------

 

Without UniSession.Synchronize; I get no errors.

 

what is the problem?

 

More precisely, how to make a progress bar in real time when the list is loaded.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...