[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    265
    Likes Received:
    636
    Reputations:
    476
    Ежели не смущают следовые количества ассемблера, то можно так:
    Code:
    program BinInput;
    {$APPTYPE CONSOLE}
    //пример ввода числа в двоичном ввиде для #Smith
    //используемая среда разработки - Delphi 7
    var a:integer;
    begin
     [COLOR=Wheat]asm [/COLOR]            //открываем ассемблерную вставку
      [COLOR=Wheat]mov a,[/COLOR][COLOR=Red]101010b[/COLOR]  //помещаем в переменную [COLOR=Wheat]a[/COLOR] число 42
    [COLOR=Wheat] end; [/COLOR]           //закрываем
     Writeln(a);     //проверяем значение переменной
     Readln;
    end.
    //аналогично вводятся числа и в других системах o-8,d-10,h-16
     
    _________________________
  2. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    Используй битовые поля.

    А по-поводу сомвола - ты путаешь с Си:
    Code:
    int x = 0b00010000;
     
  3. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    #Smith, ты походу путаешь с free pascal, там да, такое возможно подстановкой %, и явно сказано в доке, как delphi, так и к free pascal'ю, что бинарная нотация не поддерживается в delphi, только в ассемблерных вставках
     
  4. 666da

    666da New Member

    Joined:
    10 Jul 2013
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Люди здоров,решил перенести
    delphi xe2 в delphi 2010 из за огоромного веса программы,так вот проблема очень простая программа выполняет код но к обращение к некоторым визульным компонентам не проходит вообще то есть не отображает я в а х у е просто посмотрите
    обратите на тот участок где коментарии
    PHP:

    procedure TForm2
    .Button2Click(SenderTObject);
    var
    i,l,oInteger;

    login,j,item,mail:string;
    bas:string;
    mna,mnb,owner:string;
    id:string;
    dop:string;
    a:array[1..3of string;
    s4et:cardinal;
        
    otvet:string;
    begin
    button2
    .Enabled:=false;//РАЮОТАЕТ
    button3.Enabled:=false;//НИХЕРА НЕ РАБОТАЕТ ТОЛЬКО В КОНЦЕ ПРОГРАММЫ ВЫПОЛНЯЕТСЯ

    s4et:=0;

     
    j:=edit2.Text;
     
    //____________________________________///

     
    login:=copy(j,pos('http://my.mail.ru/',j)+length('http://my.mail.ru/'),length(j));
     
    login:=copy(login,pos('/',login)+1,length(login));
     
    delete(login,pos('/',login),length(login));
      
    //-----------------------------------

     
    item:=copy(j,pos('micropost/',j)+10,length(j));
     
    delete(item,pos('.',item),length(item)) ;
     
    //-------------------------------------

     
    mail:=copy(j,pos('my.mail.ru/',j)+11,length(j));
     
    delete(mail,pos('/',mail),length(mail));

      
    ///--------------------------------------------------------------//////////
      
    ProgressBar1.Max:=listbox2.Items.Count;
      for 
    := 0 to listbox2.Items.Count -do
                               
    begin




    a
    [1]:=copy(listbox2.Items[i],1,pos('@',listbox2.Items[i])-1);
     
    a[2]:=copy(listbox2.Items[i],pos('@',listbox2.Items[i])+1,pos(':',listbox2.Items[i])-pos('@',listbox2.Items[i])-1);
     
    a[3]:=copy(listbox2.Items[i],pos(':',listbox2.Items[i])+1,length(listbox2.Items[i])-1);




     
    ///--------------------------------------------------------------//////////
     
    sl.Add('page=http://my.mail.ru/');
          
    sl.Add('Login='+a[1]);
          
    sl.Add('Domain='+a[2]);
          
    sl.Add('Password='+a[3]);
        try
            
    Form2.IdHTTP1.Post('http://e.mail.ru/cgi-bin/auth'sl);
      
          
    except
       sl
    .Clear;

             
    mikro.Clear;
             
    memo2.Lines.Add(ListBox2.Items[i]) ;
            Continue;
          
    end;

          
    Form2.IdHTTP1.get(edit2.Text);

            
    bas:= Form2.IdHTTP1.get(edit2.Text);


     
    //----------------------------------------------//

    mna:=copy(bas,pos('"mna":',bas)+8,length(bas));
    delete(mna,pos('",',mna),length(mna));

     
    //----------------------------------------------//

    mnb:=copy(bas,pos('"mnb":',bas)+8,length(bas));
    delete(mnb,pos('",',mnb),length(mnb));
      
    //----------------------------------------------//



      //----------------------------------------------//


     
    dop:=IdHTTP1.get('http://my.mail.ru/'+mail+'/'+login+'/ajax?ajax_call=1&func_name=history_layer.get&mna='+mna+'&mnb='+mnb+'&encoding=windows-1251&arg_micropost_id='+item);

     
    id:=copy(dop,pos('data-like-id=\"',dop)+15,50);
     
    delete(id,pos('-',id),length(id));

     
    //-----------------------/////////////------///////-//////-//////-/

     
    owner:=copy(dop,pos('owner\": \"',dop)+11,50);
     
    delete(owner,pos('\',owner),length(owner));

    mikro.add('
    ajax_call=1');
    mikro.add('
    func_name=likes.like');
    mikro.add('
    mna='+mna);
    mikro.add('
    mnb='+mnb);
    mikro.add('
    encoding=windows-1251');
    mikro.add('
    arg_type=micropost');
    mikro.add('
    arg_item='+id); //
    mikro.add('
    arg_owner='+owner);
    mikro.add('
    arg_like=1');
      try
      otvet:=IdHTTP1.Post('
    http://my.mail.ru/cgi-bin/my/ajax?user='+login+'@'+mail+'.ru',mikro);

      
    except
      sl
    .Clear;

      
    mikro.Clear;
      
    memo2.Lines.Add(ListBox2.Items[i]) ;
      Continue;
      
    end;

       if 
    otvet='["AjaxResponse","OK","ok"]' then
         s4et
    :=s4et+1;
         
    label3.Caption:='Накручено: '+inttostr(s4et);//И ВОТ ЭТА ДРЯНЬ ВООБЩЕ НЕ РЕАГИРУЕТ ОПЯТЬ ЖЕ ТОЛЬКО В КОНЦЕ ПОЛУЧЕНОЕ ЧИСЛО ВЫВОДИТ
        
    sl.Clear;
        
    mikro.Clear;

      
    ProgressBar1.Position:=i+1;
      
    end;
      
    button2.Enabled:=true;
    button3.Enabled:=true;
     
    ProgressBar1.Position:=0;
      
    end;







    ЧТО ЗА ШЛАК БЛИН ВООБЩЕ ПЕРВЫЙ РАЗ НАТЫКАЮСЬ НА ТАКУЮ ПРОБЛЕМУ,В ЧЕМ ПРОБЛЕМА ПОМОГИТЕ
     
  5. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Судя по исходнику, код выполняется в контексте потока формы, а значит, пока выполняется цикл, форма не обрабатывает системные сообщения, в том числе прорисовку.
    Т.е. кнопка блокируется, но визуально этого не успеваешь увидеть, т.к. форма висит.

    Попробуй так:

    button3.Enabled:=false;
    Application.ProcessMessages;
     
  6. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    binarymaster все верно сказал, у тебя просто не перерисовывается форма до тех пор, пока процедура полностью не выполняется. Если у тебя однопоточное приложение, то как и было предложено выше, Application.ProcessMessages тебе поможет, в случае же с многопоточностью постоянная перерисовка будет вешать тебе процесс и очень сильно замедлять работу, поэтому лучше всего вынести процедуру с кнопки из MainThread'a и выполнять в отдельном потоке. Кода будет незначительно больше, но это поможет избавиться от залипаний интерфейса.

    А в твоем коде скорость прорисовки интерфейса формы фактически зависит от скорости интернета :D
     
  7. 666da

    666da New Member

    Joined:
    10 Jul 2013
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    о спасиб частична решена,
    делал так после кнопки

    button3.Enabled:=false;
    Application.ProcessMessages
    реакции нету

    а попробывал вот сюда

    label3.Caption:='Накручено: '+inttostr(s4et);
    Application.ProcessMessages

    Уже реагирует и на кнопки и на labeli

    а вот можно вопросик
    в этой 2010 delph вылетает ошибка там куда где я поместил код в обработчик исключительных событий
    (try except),В Delphi Xe2 ошибка не вылетала,вот посему вылетает )

    HTML:
     try 
      otvet:=IdHTTP1.Post('http://my.mail.ru/cgi-bin/my/ajax?user='+login+'@'+mail+'.ru',mikro); 
    
      except 
      sl.Clear;//Вот этот участок кода срабатывает но почему ошибка вылетает 
    
      mikro.Clear; 
      memo2.Lines.Add(ListBox2.Items[i]) ; 
      Continue; 
      end;
     
  8. 666da

    666da New Member

    Joined:
    10 Jul 2013
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    а ну да в принципе кнопки отключаются и лабелы меняются и все такое,просто не рисуется что то или краска не доходит,ну да как бы хочу эту прогу засунуть в потоки,то есть вот это фишка Application.ProcessMessages будет тормозить весь процесс в потоках,а в потоках же можно синхронизировать все это изменение в визульных компонентов и возможно проблема иссякнет,или я ошибаюсь
     
  9. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Когда ты будешь делать изменение свойств компонентов не в главном потоке, а в созданном тобой, то изменения будут отображаться моментально, без использования Application.ProcessMessages и никакой синхранизации не нужно будет.
     
  10. 666da

    666da New Member

    Joined:
    10 Jul 2013
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    сэнкс)засунул код в поток сначала с синхронизацией а потом и без нее как часики работают,а почему везде заладели синхронизация если без нее отлично работает,а почему в delphi 10-ке ошибочка вылетает когда ее сую в try except
    я специально неправильные логины сую на проверку
    try
    Form1.IdHTTP1.Post('http://e.mail.ru/cgi-bin/auth', sl);

    except
    sl.Clear;
    mikro.Clear;
    continue;
    //этот участок выполняется и прога дальше пашет но ошибка просто вылетает,глаз не радует а таг))
    end;
     
  11. 666da

    666da New Member

    Joined:
    10 Jul 2013
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    а все блин доперло try except правильно работает ошибка просто в другом участке кода,когда я будучи неавторизованным пытаюсь достать нужные параметры и всабачить их к переменным
     
  12. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Ну наверное имелась в виду синхронизация между потоками при оброботке данных. У меня например когда-то была проблема, по неопытности написал программу, которая работала в 150 потоков и постоянно писала в файл, в итоге у меня на выходе получалось что-то вроде:
    Вот тут и пришлось делать синхронизацию выгружаемого буфера :)
     
  13. .Light.

    .Light. Member

    Joined:
    12 Jul 2010
    Messages:
    195
    Likes Received:
    5
    Reputations:
    0
    Ребят помогите пожалуйста!нужен код для отслежки юрл в бренд маузере!например открываем odnoklassniki.ru/games и вылетает сообщение "иди на кухню!" )
     
  14. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Это конечно было бы здорово, но причём здесь Delphi? :)

    Одной строчкой такую задачу определённо не решить, придётся целый проект создавать... но мысли в голову приходят такие:
    1. Локальный прокси сервер на делфи, который будет выводить окошко при обнаружении нужного запроса
    2. Определять HTTP запросы при помощи WinPCap API, но там не всё так очевидно, ибо низкий уровень работы с сетью
    3. Поднять на локалхосте HTTP сервер, добавить туда домен odnoklassniki.ru, залить index.php в котором будет подобное сообщение. Ну и в конце этого прописать строчку в hosts - 127.0.0.1 odnoklassniki.ru

    По-моему наиболее простой способ #3, т.к. там вообще программировать не надо. Что же касается первого и второго - полноценные задачи, исходный код которых в один пост не поместится ;)
     
  15. .Light.

    .Light. Member

    Joined:
    12 Jul 2010
    Messages:
    195
    Likes Received:
    5
    Reputations:
    0
    Предложили такой вариант:
    uses ddeman;
    function Get_URL(Servicio: string): String;
    var
    Cliente_DDE: TDDEClientConv;
    temp:pChar;
    begin
    Result:= '';
    Cliente_DDE:= TDDEClientConv.Create(nil);
    with Cliente_DDE do
    begin
    SetLink(Servicio,'WWW_GetWindowInfo');
    temp:= RequestData('0xFFFFFFFF');
    Result:= StrPas(temp);
    StrDispose(temp); //<<-Предотвращаем утечку памяти
    CloseLink;
    end;
    Cliente_DDE.Free;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if Get_URL('IExplore') = 'odnoklassniki.ru/games' then ShowMessage('иди на кухню!');
    end;

    Но ругается на ('0xFFFFFFFF');
     
  16. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Нашёл кое-что подобное:
    http://stackoverflow.com/questions/5222301/how-to-get-the-url-from-chrome-using-delphi
     
  17. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    перехват сокетов твой выход.
     
  18. .Light.

    .Light. Member

    Joined:
    12 Jul 2010
    Messages:
    195
    Likes Received:
    5
    Reputations:
    0
    Как сделать фильтр.Допустим чтоб задавалась не кокретная ссылка.Напиример открываем mail.ru заходим в игры my.mail.ru допустим чтоб отфильтровал "mail.ru" и велетело сообщение
     
    #9558 .Light., 22 May 2014
    Last edited: 23 May 2014
  19. djramil

    djramil Member

    Joined:
    21 Apr 2009
    Messages:
    0
    Likes Received:
    9
    Reputations:
    0
    Всем привет. Пишу диплом на delphi, есть много пробелов, возникает много вопросов.

    Нужен консультант, которому я буду задавать непонятные для меня вопросы в аську.

    За вознаграждение.

    Пишите в теме или в ЛС.
    Или в ICQ 380-45-45 со ссылкой на профиль.
     
  20. cardons

    cardons Elder - Старейшина

    Joined:
    19 Jul 2005
    Messages:
    778
    Likes Received:
    324
    Reputations:
    83
    Добрый день.
    Есть постороннее приложение.
    В нем 3 ListView. Задача такова.
    1) Получить все значения в наш StringGrid - уже имеем
    2) Сделать на строке дабл клик которая к примеру имеет номер 8.

    При попытках использовать SendMessage(HndControl,LVM_GETITEMRECT,0, LongInt(@Rect)); получаю в ответ одни нули. Уже что тока не перепробовал. Подскажите кто знает.


    Code:
    procedure TMyThread.Execute;
    Var
    Hnd, HndControl:HWnd;
    i, b, q : Integer;
    WinClass: array[0..255] of Char;
      Rect: TPoint;
      ItemIndex: Integer;
      ItemHeight: Integer;
    begin
     Hnd:=FindWindow(nil, 'Client');
      if Hnd <>0 then begin
        windows.SetForegroundWindow(Hnd);   
        HndControl := FindWindowEx(hnd, 0, nil, PChar('LOGIN'));
        SendMessage(HndControl, BM_CLICK, 0, 0);
    
        Sleep(1000);
        
        HndControl := FindWindowEx(hnd, 0, nil, PChar('select country...'));
        PostMessage(HndControl, wm_LButtonDblclk, 0, 0);
        Sleep(5000);
    
    
        HndControl := FindWindowEx(hnd, 0, 'SysListView32', nil);
        b := 0;
    
        while HndControl <> 0 do
        begin
          HndControl := GetWindow(HndControl, GW_HWNDNEXT);
          GetClassNameA(HndControl, WinClass, 256);
    
          if (WinClass = 'SysListView32') then
          begin
            i:=SendMessage(HndControl,LVM_GETITEMCOUNT,0,0);
    
            GetListViewData(HndControl, 1, form1.drop_strngrd);
    
            if (b = 1) then
            begin
             // SendMessage(HndControl, WM_SETFOCUS, 0, 0);
    
              SendMessage(HndControl,LVM_GETVIEWRECT,0, LongInt(@Rect)); 
              Form1.mmo1.Lines.Add(inttostr(rect.x)+'  '+inttostr(rect.Y));
    
            end;
    
            Inc(b);
          end;
    
        end;
    
      end;
    end;
    
     
Thread Status:
Not open for further replies.