Форум: "Начинающим";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизЛогин на сайт статистики Найти похожие ветки
← →
{RASkov} © (2007-08-13 18:20) [0]Project Project1.exe raised exception class EIdWS2StubError with message "Error on call Winsock2 library function shutdown: Или приложение не вызвало WSAStartup, или произошла ошибка в WSAStartup". Process stopped. Use Step or Run to continue.
Вот такая штука вылазит. Из за чего это может быть или что бы такое сделать, чтоб ее не было?
Вылазеет только если при старте программы в окне авторизации с не верным(специально так для проверки) адресом LoginData.SUrl выполнить код где есть
try
FLoginData.SFirstPage:=DtMdl.IdHTTP.Post(LoginData.SUrl, LoginInfo);
except
ShowMessage("Возможно в адресе ошибка"#13#10"Не найден путь: "+LoginData.SUrl);
Result:=False;
end;
Сообщение показывается ... жмем ок и жмем отмена в моем окне авторизации и тут эта ошибка.
Но если при старте пройти эту авторизацию, т.е. залогинится, и в работе программы вызвать "переавторизацию", и провести такую же штуку то все нормально и никаких ошибок.
Разница при нажатии Отмена:
Если при старте - то приложение завершается
ДПР
program Project1;
uses Forms,
UFaseStat in "UFaseStat.pas" {FFaseStat},
UAutorize in "UAutorize.pas" {FrmAutorize},
UDtMdl in "UDtMdl.pas" {DtMdl: TDataModule};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TDtMdl, DtMdl);
if LoginInHost(True) then begin
Application.CreateForm(TFFaseStat, FFaseStat);
Application.Run;
end;
end.
Если во время работы то просто закрывается(уничтожается окно авторизации)...
Если еще какой код нужно то скажите, что показать....
Я с программированием для интернет вообще не знаком.... :( Может нужно этому IdHTTP что-нибудь сказать, типа закрыть соеденение впрочем я его(соеденение) вручки не делал кроме IdHTTP.Post и это единственное что я вызываю у IdHTTP...
← →
{RASkov} © (2007-08-13 18:22) [1]Во время работы - "перелогинивание" так:
if LoginInHost(False) then LoadPersonalAccount;
← →
umbra © (2007-08-13 18:42) [2]так а где
IdHTTP
живет? и что это заLoginInHost(True)
?
← →
{RASkov} © (2007-08-13 18:56) [3]> [2] umbra © (13.08.07 18:42)
> так а где IdHTTP живет?
На(в) DtMdl
> [2] umbra © (13.08.07 18:42)
> и что это за LoginInHost(True)?
Функция "залогинивания"function LoginInHost(AFirstLogin: Boolean): Boolean;
var FlName: String;
procedure ShowLoginForm(FRemember: Boolean);
Label SF;
begin
with TFrmAutorize.Create(nil) do try
edUrlExit(ActiveControl);
SF:if FRemember then begin
edUrl.Text:= LoginData.SUrl;
edName.Text:= LoginData.SName;
edPass.Text:= LoginData.SPass;
cbRemember.Checked:=LoginData.Remember;
cbNotAsk.Checked:= LoginData.NotAsk;
end;
if ShowModal=mrOk then begin
Result:=Login;
if not Result then goto SF else SaveLoginData;
end else Result:=False;
finally Free; end;
end;
begin
FlName:=ExtractFilePath(Application.ExeName)+LOGINFILENAME;
Result:=FileExists(FlName);
if Result and AFirstLogin then begin
LoadLoginData(FlName);
if LoginData.NotAsk then Result:=Login else ShowLoginForm(LoginData.Remember);
end else ShowLoginForm(not AFirstLogin);
end;
← →
{RASkov} © (2007-08-13 18:59) [4]> Result:=Login;
Login:function Login: Boolean;
function ValidUrl: Boolean;
var N: Integer;
begin
Result:=False;
if PosEx("http://", LoginData.SUrl, 2)>1 then Exit;
N:=Pos("http://", LoginData.SUrl);
if N<1 then FLoginData.SUrl:="http://"+FLoginData.SUrl;
if LoginData.SUrl[Length(LoginData.SUrl)]<>"/" then FLoginData.SUrl:=FLoginData.SUrl+"/";
Result:=True;
end;
var LoginInfo: TStrings;
begin
LoginInfo := TStringList.Create;
Screen.Cursor:=crHourGlass;
Result:=False;
if not ValidUrl then begin
ShowMessage("Не верный адрес!"); Exit;
end;
try
LoginInfo.Clear;
LoginInfo.Add("UserName="+LoginData.SName);
LoginInfo.Add("Password="+LoginData.SPass);
with DtMdl do try
try
FLoginData.SFirstPage:=IdHTTP.Post(LoginData.SUrl, LoginInfo);
except
ShowMessage("Возможно в адресе ошибка"#13#10"Не найден путь: "+LoginData.SUrl); Exit;
end;
try
DtMdl.IdHTTP.URL.URI:=AnsiLowerCase(DtMdl.IdHTTP.URL.URI);
if Pos("login.csp", DtMdl.IdHTTP.URL.URI)>0 then begin
ShowMessage("Не верный логин"); Exit;
end;
Result:=Pos("personal.csp", DtMdl.IdHTTP.URL.URI)>0;
except
ShowMessage("Error login");
end;
// Result:=True;
except
Result:=False;
end;
finally
LoginInfo.Free;
Screen.Cursor:=crDefault;
end;
end;
← →
{RASkov} © (2007-08-13 19:24) [5]Вроде разобрался....
Т.е. если при старте, то Application.CreateForm(TDtMdl, DtMdl); - создали до логина
и если обратится к IdHttp.Рost то происходит автоконнект
но если нажать отмену, то что-то в Winsock2 "вываливается".... так как нет нормально завершения DtMdl
а если это в работе программы сделать, то все потом нормально закрывается... низнаю как объяснить :(
Вообщем вставил такую строку:function LoginInHost(AFirstLogin: Boolean): Boolean;
.....
begin
FlName:=ExtractFilePath(Application.ExeName)+LOGINFILENAME;
Result:=FileExists(FlName);
if Result and AFirstLogin then begin
LoadLoginData(FlName);
if LoginData.NotAsk then Result:=Login else ShowLoginForm(LoginData.Remember);
end else ShowLoginForm(not AFirstLogin);
!! if AFirstLogin then DtMdl.Free;
end;
И все встало на свои места...
← →
{RASkov} © (2007-08-13 21:34) [6]А можно я сюда же еще один вопросик задам?
При таком вот подходе:function Login: Boolean;
.......
begin
with TFrmConnectInfo.Create(nil) do try
DtMdl.FrmInfoHandle:=Handle; //нужно для отправки сообщений окну FrmConnectInfo
lbStatus.Caption:="Начало соединения";
Show; Refresh;
......
FLoginData.SFirstPage:=IdHTTP.Post(LoginData.SUrl, LoginInfo);
.......
finally
DtMdl.FrmInfoHandle:=0;
Free;
end;
end;
Можно ли как-нибудь получить в процентах ход выполнения Post?
Я пока добился только вот этого:unit UConnectInfo;
....
const WM_UPDTSTATUS = WM_USER+1;
.....
type
TFrmConnectInfo = class(TForm)
lbStatus: TLabel;
ProgressBar1: TProgressBar;
private
procedure UpdateStatus(var Mes: TMessage); message WM_UPDTSTATUS;
{ Private declarations }
......
procedure TFrmConnectInfo.UpdateStatus(var Mes: TMessage);
begin
lbStatus.Caption:=String(Mes.LParam);
Refresh;
end;
И в UDtMdlprocedure TDtMdl.IdHTTPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String);
begin
if FrmInfoHandle<>0 then SendMessage(FrmInfoHandle, WM_UPDTSTATUS, 0, Integer(AStatusText));
end;
В таком виде вроде все нормально... есть информационно окно, которое избавляет от чувства зависания программы, так как там постоянно "что-то" мелькает...
Но и хотелось бы для полного "кайфа" сделать заполнение ProgressBar"а.... Можно ли это как-то "замутить" или это в данном случае не реально?
Я так же почитал и про
IdHTTP.OnWorkBegin
IdHTTP.OnWork
IdHTTP.OnWorkEnd
но так понял, что от них толку мало.... так как я незнаю AWorkCountMax в OnWorkBegin...
Впрочем там Connect/Disconnect происходит по нескольку раз, т.е. несколько раз OnWorkХхх вызываются...
А может я не с того компонента начал знакомство с программированием для интернета....? Из БОЛЬШОГО их обилия я почему-то остановился пока на нем(TIdHTTP)... Спасибо за время потраченное на чтение моих постов. Но иначе никак.... мне кажется, что если мне не понятно, то и всем так :)
Отсюда такие подробности.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c