Парни помогите пожалуйста! Есть код: 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. Проблема в том, что после запуска потоков выскакивает следующая ошибка: Но после удаления критической секции, все отлично работает, правда без синхронизации : 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; Подскажите пожалуйста в чем причина
ну давай начнем по порядку, для чего все это нужно, что бы не было одновременного доступа разными потоками к одной и той же области памяти, то бишь доступ ко всем глобальным переменным, к которым обращаются из нескольких потоков, должен быть синхронизирован каким-либо способом, а теперь глянь на свой код, и скажи все ли переменные ты синхронизировал?
Нужно всего лишь, чтобы потоки не брали одни и те же строчки из memo одновременно, то есть каждый поток брал разную строчку по порядку. Для этого я в критической секции увеличил переменные на 1, а после подставил вместо номера линии.
Не смеши людей, прочитай сначала про обьекты синхронизации, критические секции, мютексы, InterlockedIncrement и декремент (то что тебе и нужно как я понял) и прочее. А потом уже спорь.
Не понимаю где вы тут увидели спор. Собственно уточнил человеку мою ситуацию. А прочитать я всегда успею. Просто хотелось, чтобы какой-нибудь добрый человек подсказал как конкретно сделать.
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] .......
Добрый день. Нужна помощь по компоненту 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 и заново навести на нужный ряд.(если есть решение данного вопроса буду оч признательна)
Посоны, у кого есть рабочий пример для отправки get запроса на winsock'ах ? Я перерыл весь гугл, все что нашел - не работало P.S. Делф 2010
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
особой разницы нет какую делфи используешь для этого, главное это соответствие передаваемых типов данных. Code: PChar: Delphi 7: PAnsiChar Delphi 2010: PWideChar String: Delphi 7: AnsiString Delphi 2010: WideString ......... из-за этого и могут возникнуть проблемы...
procedure TForm1.WMSysCommand; begin if (Msg.CmdType = SC_MAXIMIZE) then begin form2.show; end; end; процедура перехвата события разворачивания формы ...после ее выполнения проект зависает...на Form1.close не реагирует.В чем проблема? разрешил проблему!
Добрый день. Подскажите как составить правильно функцию вычисляющую решение по данному примеру 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
Спасибо вот так решила Code: i:=FloatToStr(1-6 / (StrToFloat(yarka_edt.Text) / StrToFloat(ukr_edt1.Text)+6));