[ 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. 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, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdHTTP, ExtCtrls, ComCtrls, Gauges, SyncObjs;
    
    type
      TForm1 = class(TForm)
        IdHTTP1: TIdHTTP;
        GroupBox1: TGroupBox;
        Label1: TLabel;
        Label3: TLabel;
        GroupBox3: TGroupBox;
        Label2: TLabel;
        Edit1: TEdit;
        Label4: TLabel;
        Edit2: TEdit;
        Label5: TLabel;
        Label6: TLabel;
        Edit3: TEdit;
        GroupBox4: TGroupBox;
        Memo1: TMemo;
        Label7: TLabel;
        GroupBox2: TGroupBox;
        Memo2: TMemo;
        Edit4: TEdit;
        Label8: TLabel;
        StaticText2: TStaticText;
        Gauge1: TGauge;
        GroupBox5: TGroupBox;
        Memo3: TMemo;
        GroupBox6: TGroupBox;
        Memo4: TMemo;
        Memo5: TMemo;
        Memo6: TMemo;
        Button2: TButton;
        GoodLabel: TLabel;
        BadLabel: TLabel;
        Label9: TLabel;
        StaticText1: TStaticText;
        Edit5: TEdit;
        UpDown1: TUpDown;
        Label10: TLabel;
        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, Email,Accs:integer;
      Work:boolean;
      CS:TcriticalSection;
      GoodFile, BadFile: textfile;
    
    implementation
    
    {$R *.dfm}
    
    constructor TNewThread.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     GoodLabel.Caption:='0';
     BadLabel.Caption:='0';
     Gauge1.MaxValue:=Form1.Memo1.Lines.Count;
     Gauge1.Progress:=0;
     Email:=-1;
     Accs:=-1;
     Work:=true;
     for Thread:=1  to strtoint(Edit5.Text) do
      TNewThread.Create(false);
     Thread:=strtoint(Edit5.Text);
    end;
    
    procedure TNewThread.Execute;
    var CurEmail,CurAccs:integer;
        sw,dw,cw,fw,rw,FAccs,FPass:string;
        data:Tstringlist;
        HTTP: TIdHTTP;
    begin
     while Work do begin
       CS.Enter;
       if Accs>Form1.Memo3.Lines.Count then Accs:=-1;
       Inc(Email);
       if Email<Form1.Memo1.Lines.Count then CurEmail:=Email else Work:=false;
       Inc(Accs);
       CurAccs:=Accs;
       CS.Leave;
    
    if Work then begin
    
    Form1.StaticText1.Caption:=IntToStr(Form1.Memo1.Lines.Count);
    Form1.Gauge1.MaxValue:=Form1.Memo1.Lines.Count;
    Form1.Button2.Enabled:=False;
    HTTP:=TIdHTTP.create(nil);
    HTTP.HandleRedirects:=true;
    
    //Авторизация
    sw:='авыавыавы;
    FAccs:= Copy(Form1.Memo3.Lines[CurAccs],1,Pos(';',Form1.Memo3.Lines[CurAccs])-1);
    FPass:= Copy(Form1.Memo3.Lines[CurAccs],Pos(';',Form1.Memo3.Lines[CurAccs])+1,Length(Form1.Memo3.Lines[CurAccs]));
    Data:=TstringList.Create;
    Data.Add('login='+FAccs);
    Data.Add('pass='+FPass);
    HTTP.Post(sw, Data);
    //Конец авторизации
    
    //Смена емалов со списка
    dw:='апвпв';
    Data:=TstringList.Create;
    with Data do begin
            Add('time_zone=1');
            Add('reports=0');
            Add('news=1');
            Add('digest=1');
            Add('limit=20');
            Add('test_email='+Form1.Memo1.Lines[CurEmail]);
            Add('report_email=');
            Add('test_from_name=рпарппа');
            Add('test_from_email='+Form1.Edit2.Text);
            Add('extra_from_name=рпарипа');
            Add('extra_from_email=ипаа');
            Add('country=2');
            Add('city=Forest');
            Add('addr=Forest');
            Add('phone=+3765756765765');
            Add('apeal_m=gdfgd');
            Add('apeal_w=gfd');
            Add('apeal_u=fdg');
    end;
    try
    HTTP.Post(dw, Data);
    except
    end;
    //Конец смены емайлов со списка
    
    //Начало рассылки
    rw:='fdsfds';
    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');
        end;
        try
        HTTP.Post(rw, Data);
        Form1.GoodLabel.Caption:=IntToStr(StrToInt(Form1.GoodLabel.Caption)+1);
        Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1;
        Form1.Memo2.Lines.Add('Отправили на - ' +Form1.Memo1.Lines[CurEmail]);
        except
        Form1.BadLabel.Caption:=IntToStr(StrToInt(Form1.BadLabel.Caption)+1);
        end;
      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.
    
    end.
    
    Проблема в том, что после запуска потоков выскакивает следующая ошибка:

    [​IMG]

    Но после удаления критической секции, все отлично работает, правда без синхронизации :
    Code:
       CS.Enter;
       if Accs>Form1.Memo3.Lines.Count then Accs:=-1;
       Inc(Email);
       if Email<Form1.Memo1.Lines.Count then CurEmail:=Email else   Work:=false;
       Inc(Accs);
       CurAccs:=Accs;
       CS.Leave;
    
    Подскажите пожалуйста в чем причина :confused:
     
    #8821 muip, 31 Jan 2012
    Last edited: 31 Jan 2012
  2. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    ну дак сделай нормально синхронизацию, а не вырывай куском, тогда не будет ошибок доступа к памяти
     
  3. muip

    muip New Member

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

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    ну давай начнем по порядку, для чего все это нужно, что бы не было одновременного доступа разными потоками к одной и той же области памяти, то бишь доступ ко всем глобальным переменным, к которым обращаются из нескольких потоков, должен быть синхронизирован каким-либо способом, а теперь глянь на свой код, и скажи все ли переменные ты синхронизировал?
     
  5. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Нужно всего лишь, чтобы потоки не брали одни и те же строчки из memo одновременно, то есть каждый поток брал разную строчку по порядку. Для этого я в критической секции увеличил переменные на 1, а после подставил вместо номера линии.
     
  6. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Не смеши людей, прочитай сначала про обьекты синхронизации, критические секции, мютексы, InterlockedIncrement и декремент (то что тебе и нужно как я понял) и прочее. А потом уже спорь.
     
    1 person likes this.
  7. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Не понимаю где вы тут увидели спор. Собственно уточнил человеку мою ситуацию. А прочитать я всегда успею. Просто хотелось, чтобы какой-нибудь добрый человек подсказал как конкретно сделать.
     
  8. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    muip, какая нафиг разница одни и те же или нет строки, ты работаешь не с ними, а с методами одного и того же memo
    ах да, твоя прога долго не протянет, если даже сделаешь нормально синхронизацию:
    Code:
    	.........
    	[B]Data:= TstringList.Create;[/B]
    	with Data do begin
    		Add('time_zone=1');
    		Add('reports=0');
    		........
    	end;
    
    	try HTTP.Post(dw, Data);
    	except
    	end;
    	//Конец смены емайлов со списка
    
    	//Начало рассылки
    	rw:='http://profi-post.org/testmail';
    	[B]Data:=TStringList.Create;[/B]
    	.......
    
     
    #8828 alexey-m, 31 Jan 2012
    Last edited: 31 Jan 2012
  9. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Добрый день. Нужна помощь по компоненту StringGrid.
    А именно...
    На форме лежит StringGrid с 4 колонками и 20 рядами.
    Пользователю показываются только 2 колонки 0 и 1.
    В StringGrid на событии OnSelectSell висит функция при выделении к примеру 2 ряда открывается новая панель и в нее передаются данные с StringGrid а сам StringGrid временно закрывается.

    В 3 и 4 колонка хранятся данные которые необходимо показывать как подсказку пользователю при наведении на ряд в StringGrid. То есть пользователь навел мышку на 2 ряд и ему из 3 и 4 колонки во 2 ряду вывела общая подсказка.

    Так вот вопрос как реализовать вывод данной подсказки пользователю?
    P.S. Не стоит отправлять гуглить все методы что в интернете основаны на OnMouseMove и MouseToCell
    Code:
    procedure TForm1.strngrd1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      r: integer;
      c: integer;
    begin
      strngrd1.MouseToCell(X, Y, C, R);
      with strngrd1 do
      begin
        if ((Row <> r) or(Col <> c)) then
        begin
          Row := r;
          Col := c;
          Application.CancelHint;
          strngrd1.Hint :=IntToStr(r)+#32+IntToStr(c);
        end;
       end;
      end;
    
    
    Но это не подходит мне т.к. при наведении мышкой выделяет ряд а как указано выше при выделении открывается панель и закрывается StringGrid.


    В общем найдено мной одно решение.
    Code:
    procedure TForm1.strngrd1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      var
        Row:Integer;
    begin
      Row:= Y div strngrd1.DefaultRowHeight;
    
      strngrd1.Hint :=strngrd1.Rows[Row].Strings[3]+#32+strngrd1.Rows[Row].Strings[4];
    
    end;
    
    Но оно не идеальное по тому что
    1) Если список с прокруткой то данный метод уже является не действительным
    2) Чтобы повторно показать подсказку на другом ряде надо выйти за пределы StringGrid и заново навести на нужный ряд.(если есть решение данного вопроса буду оч признательна)
     
    #8829 Rastamanka, 2 Feb 2012
    Last edited: 2 Feb 2012
  10. Mr.Snuffer

    Mr.Snuffer Member

    Joined:
    2 Jul 2010
    Messages:
    140
    Likes Received:
    13
    Reputations:
    0
    Посоны, у кого есть рабочий пример для отправки get запроса на winsock'ах ?
    Я перерыл весь гугл, все что нашел - не работало :(

    P.S. Делф 2010
     
  11. Metal-Core

    Metal-Core Member

    Joined:
    20 Sep 2011
    Messages:
    226
    Likes Received:
    21
    Reputations:
    0
    Делай на синапсе,ведь он на основе винокса.
     
  12. Mr.Snuffer

    Mr.Snuffer Member

    Joined:
    2 Jul 2010
    Messages:
    140
    Likes Received:
    13
    Reputations:
    0
    Сделал, но вес увеличился в 11 раз, + 2 антивиря начали пищать. :(
     
  13. vernite akk=

    vernite akk= New Member

    Joined:
    18 May 2011
    Messages:
    73
    Likes Received:
    2
    Reputations:
    0
    http://forum.antichat.ru/thread123692-%D3%D7%C8%CC%D1%DF+%C8%D1%CF%CE%CB%DC%C7%CE%C2%C0%D2%DC+WINSOCK.html
     
  14. beBoss

    beBoss New Member

    Joined:
    29 Sep 2010
    Messages:
    21
    Likes Received:
    1
    Reputations:
    0
    Friends, how to read this simple captcha:
    click
     
  15. alexey-m

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

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    особой разницы нет какую делфи используешь для этого, главное это соответствие передаваемых типов данных.
    Code:
    PChar: 
        Delphi 7: PAnsiChar
        Delphi 2010: PWideChar
    String:
        Delphi 7: AnsiString
        Delphi 2010: WideString
    .........
    
    из-за этого и могут возникнуть проблемы...
     
  16. KEKSoGEN

    KEKSoGEN New Member

    Joined:
    5 Oct 2010
    Messages:
    10
    Likes Received:
    1
    Reputations:
    0
    procedure TForm1.WMSysCommand;
    begin
    if (Msg.CmdType = SC_MAXIMIZE) then begin
    form2.show;
    end;
    end;

    процедура перехвата события разворачивания формы ...после ее выполнения проект зависает...на Form1.close не реагирует.В чем проблема?
    разрешил проблему!
     
    #8836 KEKSoGEN, 6 Feb 2012
    Last edited: 6 Feb 2012
  17. copz1337

    copz1337 Banned

    Joined:
    5 Aug 2011
    Messages:
    30
    Likes Received:
    2
    Reputations:
    0
    Подскажите в интернете хорошие книжки по Delphi.
    Хочу начать с нуля и только по книжке)
     
  18. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Добрый день.
    Подскажите как составить правильно функцию вычисляющую решение по данному примеру
    Code:
    1 – 6 / ( число 1 / число 2 + 6 )
    Пробую
    Code:
     i:=1-6 div (StrToInt(yarka_edt.Text) div StrToInt(ukr_edt1.Text)+6);
     s:=1-6 mod (StrToInt(yarka_edt.Text) div StrToInt(ukr_edt1.Text)+6);
     d:=i+s;
    
    В итоге получаю какой то бред. Хотя если к примеру поставить в первое число 200 а во второе 500 должно получиться 0,0625
     
  19. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Code:
     i:=1-6 / (200 / 500+6);
    будет 0,0625
     
  20. Rastamanka

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

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Спасибо вот так решила
    Code:
       i:=FloatToStr(1-6 / (StrToFloat(yarka_edt.Text) / StrToFloat(ukr_edt1.Text)+6));
     
Thread Status:
Not open for further replies.