[ 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. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    2pick, немного не догоняю, что ты конкретно хочешь, но все таки возможные вариации:
    Code:
    type
      MY_TYPE = (
        item_1 = $02,
        item_2,
        item_3,
        item_4 = $7F);
    
      // или можно не указывать конкретные значения 
    
      MY_TYPE = (item_1, item_2, item_3, item_4);
    другой вариант
    Code:
    const
      count = 2;
    
      MY_CONST: array[0..count - 1] of record
        id: Integer;
        ch: Char; 
      end = (
      (id: 0; ch: 'A'),
      (id: 2; ch: 'B'));
    
     
  2. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Парни, помогите пожалуйста добить многопоточность. Вот код:

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
      StdCtrls, ComCtrls, Gauges, SyncObjs;
    
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        UpDown1: TUpDown;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        OpenDialog1: TOpenDialog;
        GoodLabel: TLabel;
        BadLabel: TLabel;
        IdHTTP1: TIdHTTP;
        Gauge1: TGauge;
        Button2: TButton;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        StaticText1: TStaticText;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
     TNewThread = class(TThread)
      private
       FAcc : string;
       FPas : string;
       Rez : Integer;
      protected
        procedure Execute; override;
      public
        constructor Create(CreateSuspended: Boolean);
      end;
    
    var
      Form1: TForm1;
      Accounts:Tstringlist;
      Thread, Acc:integer;
      Work:boolean;
      CS:TcriticalSection;
      GoodFile, BadFile: textfile;
    
    implementation
    
    {$R *.dfm}
    
    constructor TNewThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
     if OpenDialog1.Execute then
      begin
       Accounts.Clear;
       Accounts.LoadFromFile(OpenDialog1.FileName);
      end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     Gauge1.MaxValue:=Memo1.Lines.Count;
     Gauge1.Progress:=0;
     Acc:=-1;
     Work:=true;
     for Thread:=1  to strtoint(Edit1.Text) do
      TNewThread.Create(false);
     Thread:=strtoint(Edit1.Text);
    end;
    
    procedure TNewThread.Execute;
    var CurAcc,i:integer;
        Data:TStringList;
        StrPage,sw,dw,rw,fw:string;
    begin
     while Work do
      begin
       CS.Enter;
       Inc(Acc);
       if Acc<Form1.Memo1.Lines.Count then CurAcc:=Acc else Work:=false;
       CS.Leave;
    
       if Work then
        begin
         Form1.idhttp1.HandleRedirects:=true;
         sw:=Form1.Edit7.Text;
         Data:=TstringList.Create;
         Data.Add('login=51745');
         Data.Add('pass=8e9N3h9a7x3b');
         StrPage:=Form1.idhttp1.Post(sw, Data);
         //Конец авторизации
    
         //Смена емалов со списка
         i:=0;
         dw:=Form1.Edit8.Text;
         Data:=TstringList.Create;
         Data.Add('time_zone=1');
         Data.Add('reports=0');
         Data.Add('news=1');
         Data.Add('digest=1');
         Data.Add('limit=20');
         Data.Add('test_email='+Form1.Memo1.Lines[i+1]);
         Data.Add('report_email=');
         Data.Add('test_from_name=ВКонтакте.ру');
         Data.Add('test_from_email='+Form1.Edit2.Text);
         Data.Add('extra_from_name=ВКонтакте.ру');
         Data.Add('[email protected]');
         Data.Add('country=2');
         Data.Add('city=Forest');
         Data.Add('addr=Forest');
         Data.Add('phone=+375299791228');
         Data.Add('apeal_m=gdfgd');
         Data.Add('apeal_w=gfd');
         Data.Add('apeal_u=fdg');
         StrPage:=Form1.idhttp1.Post(dw, Data);
         //Конец смены емайлов со списка
    
         rw:=Form1.Edit9.Text;
         Data:=TStringList.Create;
          with Data do begin
            Add('num=1');
            Add('list_name=text');
            Add('author_name='+UTF8Encode(Form1.Edit1.Text));
            Add('send=1');
            Add('act=mail');
            Add('subject='+UTF8Encode(Form1.Edit4.Text));
            Add('priority=3');
            Add('body='+UTF8Encode(Form1.Edit3.Text));
            Add('day=0');
            Add('h=0');
            Add('min=0');
            Add('templates=0');
            Form1.StaticText1.Caption:=IntToStr(i);
            i:=i+1;
         end;
         try
          StrPage:=Form1.idhttp1.Post(rw, Data);
          Rez:=-1;
         except
           Rez:=1;
         end;
         Data.Free;
        end;
      end;
     dec(Thread);
     if Thread=0 then ShowMessage('OK');
    end;
    
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Accounts.Free;
     CS.Free;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Accounts:=Tstringlist.create;
     CS:=TcriticalSection.create;
    end;
    
    end.
    
    Проблема в том, что один запрос работает, а когда сделал вот так многопоточность, не хочет запрос выполнятся. Помогите пожалуйста что я не атк напортачил? :mad:
     
  3. 2pick

    2pick Elder - Старейшина

    Joined:
    17 Mar 2007
    Messages:
    117
    Likes Received:
    39
    Reputations:
    2
    по полкам разложу:
    нужно в массиве привести соответствия кнопарям VK_0 и т.п., т.е. Arr['A']:=VK_A, Arr['0']:=VK_0
    Чтоб не грузить через процедуры и т.п. - делаю это в константе, отсюда - в индексы массива нужно задать конкретные значения: '0'..'9', 'A'..'Z', 'F1'..'F12'
    Не буду вдаваться в подробности для чего надо... но надо. дальнейшие запросы для данного массива будут в таком виде
    Knopka:=Arr[Text];
    В пхп все просто делается... в дельфе никак не могу вспомнить как объеденить диапазоны индексов.
     
    #8803 2pick, 23 Jan 2012
    Last edited: 23 Jan 2012
  4. 2pick

    2pick Elder - Старейшина

    Joined:
    17 Mar 2007
    Messages:
    117
    Likes Received:
    39
    Reputations:
    2
    idhttp1 расчитана в данном случае на 1 поток, т.е. твоя хттп индюшка захлебывается в собственных соплях... еще и куча урдалаков льет сопли на нее... она просто утонула :).
    тебе нужно для каждого потока свой idhttp, но это извращение... у тебя ресурсы системы этот инди жрать будет будь здоров... пиши на winsock

    +индейка лежит в классе формы, а значит обращаться к ней надо на "вы" :)... т.е. через класс формы Form1.IdHTTP1
     
    #8804 2pick, 23 Jan 2012
    Last edited: 23 Jan 2012
  5. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    массив определяется как:
    Code:
    type Name = array[Ordinal..Ordinal] of Base type;
    то есть нельзя в качестве индекса указывать строку, чем будет являться 'F12', должно быть число
     
  6. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Посылаю запрос к серверу и получаю в ответ html страницу.
    В этой странице около 500 строк.
    Задача достать из этой страницы значение 1019066 которое находиться между ser_info_add_chrs?uid=1019066&IconsP
     
  7. justonline

    justonline network ninja

    Joined:
    27 Jul 2011
    Messages:
    499
    Likes Received:
    60
    Reputations:
    53
    /rs\?uid=(.*)&IconsP/
     
  8. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Вам не кажется что регулярки данного типа не подходят для Delphi? :))

    В общем вот такую функцию сделала и все ровно.
    PHP:
    function parse_html(text_for_parse,str_open_parse,str_cancel_parse:string):string;
    var
      
    position:Integer;
     
    begin
       position
    :=AnsiPos(str_open_parse,text_for_parse);
       
    delete(text_for_parse,1,position+Length(str_open_parse)-1);
       
    position:=AnsiPos(str_cancel_parse,text_for_parse);
       
    Delete(text_for_parse,position,Length(text_for_parse));
       
    Result:=text_for_parse;
     
    end;

     
  9. justonline

    justonline network ninja

    Joined:
    27 Jul 2011
    Messages:
    499
    Likes Received:
    60
    Reputations:
    53
    тебе не кажется, что есть модули для делфи, которые позволяют юзать такие регулярки. есть очень классная библа...не помню линка на нее.
     
  10. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    Code:
    uses ......, RegExpr;
    
    ....
    
    var r: TRegExpr;
    
    ....
    
    r := TRegEpr.Create;
    r.Expression := '<a href="(.*?)">(.*?)</a>';
    if r.Exec(InputString) then
      repeat
        ShowMessage('link: ' + r.Match[1] + #13#10 + 'text: ' + r.Match[2]);
      until not r.ExecNext;
    r.Free;
    
    ......
    
    Как-то так.. Библиотека RegExpr - http://regexpstudio.com/ru/TRegExpr/TRegExpr.html
     
  11. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Сделал чтобы для каждого потока создавался свой idhttp. Но при компиляции выдает такую ошибку Not enough actual parameters на строке HTTP:=TIdHTTP.create; Подскажи пожалуйста как исправить? :(

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
      StdCtrls, ComCtrls, Gauges, SyncObjs;
    
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        UpDown1: TUpDown;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        OpenDialog1: TOpenDialog;
        GoodLabel: TLabel;
        BadLabel: TLabel;
        IdHTTP1: TIdHTTP;
        Gauge1: TGauge;
        Button2: TButton;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        Edit5: TEdit;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
     TNewThread = class(TThread)
      private
       FAcc : string;
       FPas : string;
       Rez : Integer;
      protected
        procedure Execute; override;
      public
        constructor Create(CreateSuspended: Boolean);
      end;
    
    var
      Form1: TForm1;
      Accounts:Tstringlist;
      Thread, Acc:integer;
      Work:boolean;
      CS:TcriticalSection;
      GoodFile, BadFile: textfile;
    
    implementation
    
    {$R *.dfm}
    
    constructor TNewThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName);
     if OpenDialog1.Execute then
      begin
       Accounts.Clear;
       Accounts.LoadFromFile(OpenDialog1.FileName);
      end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     Gauge1.MaxValue:=Memo1.Lines.Count;
     Gauge1.Progress:=0;
     Acc:=-1;
     Work:=true;
     for Thread:=1  to strtoint(Edit1.Text) do
      TNewThread.Create(false);
     Thread:=strtoint(Edit1.Text);
    end;
    
    procedure TNewThread.Execute;
    var CurAcc,i:integer;
        Data:TStringList;
        StrPage,sw,dw,rw,fw:string;
        HTTP: TIdHTTP;
    begin
     while Work do begin
    
       if Work then
        begin
         sw:=Form1.Edit7.Text;
         Data:=TstringList.Create;
         Data.Add('login=51745');
         Data.Add('pass=8e9N3h9a7x3b');
         HTTP:=TIdHTTP.create;
         HTTP.HandleRedirects:=false;
         try
         HTTP.Post(sw, data);
         except
         ShowMessage('Ошибка!');
         end;
         //Конец авторизации
    
         //Смена емалов со списка
         i:=0;
         dw:=Form1.Edit8.Text;
         Data:=TstringList.Create;
         Data.Add('time_zone=1');
         Data.Add('reports=0');
         Data.Add('news=1');
         Data.Add('digest=1');
         Data.Add('limit=20');
         Data.Add('[email protected]');
         Data.Add('report_email=');
         Data.Add('test_from_name=ВКонтакте.ру');
         Data.Add('test_from_email='+Form1.Edit2.Text);
         Data.Add('extra_from_name=ВКонтакте.ру');
         Data.Add('[email protected]');
         Data.Add('country=2');
         Data.Add('city=Forest');
         Data.Add('addr=Forest');
         Data.Add('phone=+3752954654654');
         Data.Add('apeal_m=gdfgd');
         Data.Add('apeal_w=gfd');
         Data.Add('apeal_u=fdg');
         HTTP:=TIdHTTP.create;
         HTTP.HandleRedirects:=false;
         try
         HTTP.Post(dw, data);
         except
         ShowMessage('Ошибка!');
         end;
         //Конец смены емайлов со списка
    
         rw:=Form1.Edit9.Text;
         Data:=TStringList.Create;
          with Data do begin
            Add('num=1');
            Add('list_name=text');
            Add('author_name='+UTF8Encode(Form1.Edit1.Text));
            Add('send=1');
            Add('act=mail');
            Add('subject='+UTF8Encode(Form1.Edit4.Text));
            Add('priority=3');
            Add('body='+UTF8Encode(Form1.Edit3.Text));
            Add('day=0');
            Add('h=0');
            Add('min=0');
            Add('templates=0');
            Form1.StaticText1.Caption:=IntToStr(i);
            i:=i+1;
            HTTP:=TIdHTTP.create;
            HTTP.HandleRedirects:=false;
         end;
         try
          HTTP.Post(rw, data);
          Rez:=-1;
         except
         Rez:=1;
         end;
         HTTP.Free;
         data.Free;
        end;
      end;
     dec(Thread);
     if Thread=0 then ShowMessage('OK');
    end;
    
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Accounts.Free;
     CS.Free;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Accounts:=Tstringlist.create;
     CS:=TcriticalSection.create;
    end;
    
    end.
    
     
  12. Timon132009

    Timon132009 Member

    Joined:
    7 Jun 2009
    Messages:
    137
    Likes Received:
    19
    Reputations:
    0
    Если не ошибаюсь, то надо HTTP:=TIdHTTP.create(nil);
     
  13. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    гаварю же.. можно взять только непрерівній диапазон...
    т. е. можеш взят
    A: Array [Char] = (0,0,0,0,{...,} 1,2,3,4)
    только тогда прийдьотся заполнить все значения (AnsiChar 256, WideChar 65536 значений)
    можно сократить:
    A: Array ['0'..Char({F12})] //...
     
    1 person likes this.
  14. cardons

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

    Joined:
    19 Jul 2005
    Messages:
    778
    Likes Received:
    324
    Reputations:
    83
    Добрый день.
    Подскажите как сделать скриншот выделенной области экрана(вне формы!). В области формы это делается анализируя события OnMouseDown,OnMouseUp,OnMouseMove. А как организовать это в любой области экрана при том чтобы при выделении область выделения обводилась линией?
     
  15. Ti Jock

    Ti Jock Member

    Joined:
    5 Apr 2010
    Messages:
    1
    Likes Received:
    6
    Reputations:
    3
    Ему надо сделать скрин любого участка экрана, а не самой формы.
     
  16. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    cardons, получай контекст десктопа, копируй нужную область через BitBlt, ну и сохраняй куда тебе надо, GetCursorPos в помощь для получения области, Rectangle для рисования прямоугольника)
     
  17. KEKSoGEN

    KEKSoGEN New Member

    Joined:
    5 Oct 2010
    Messages:
    10
    Likes Received:
    1
    Reputations:
    0
    вопросик возник-на диске имеется файл без расширения,программно присвоить расширение файлу и затем после нескольких операций снова его убрать.как?
     
  18. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    KEKSoGEN, простым переименованием RenameFile
     
  19. KEKSoGEN

    KEKSoGEN New Member

    Joined:
    5 Oct 2010
    Messages:
    10
    Likes Received:
    1
    Reputations:
    0
    стою перед выбором,посоветуйте,в программе нужно выводить текст,видео,аудио...не могу решить с типом интерфейса(ссылочный и закладочный),и куда удобнее выводить....текст можно выводить в label и делать события Click на ссылки,можно в Textbox но тогда затруднен вывод ссылок,придется делать отд. вкладки с видео и аудио,либо в html-просто с ссылками(но проблема в том что видео должно выводиться в программе)-сложность обработки события
     
  20. DJ4J

    DJ4J Member

    Joined:
    23 Aug 2009
    Messages:
    0
    Likes Received:
    53
    Reputations:
    1
    Такая вот просьба.
    Посоветуйте литературы по дельфи.
    В своем городе хотел купить, но нигде не нашел, что искал.
    Хочу купить на озоне, ну или еще в каком-то крупном онлайн магазине.
    Обязательно наличие описания WinSock.И книга должна быть для начинающих.
    Чтобы только открыв книгу, на меня не посыпались непонятные термины.
     
Thread Status:
Not open for further replies.