Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi 2

Автор: Larry
Дата сообщения: 05.07.2006 08:07
Помогите плиз, уже голова опухла.

Есть типизированный файл (f: file of char), после открытия OpenDialog нужно перебрать файл на наличие некоторых символов. Выполняю следующее:

Цитата:
AssignFile(f, Open_.FileName);
Reset(f);
for i:=0 to FileSize(f)-4 do begin
Seek(f, i);
BlockRead(f, A, 4);
[определенные проверки]
end;


Первый раз цикл for обрабатывается нормально, а во второй на команде Seek(f, i) уже слетает с ошибкой I/O Error 6. Подскажите, в чем может быть дело.

Заранее благодарен...

Автор: ShIvADeSt
Дата сообщения: 05.07.2006 09:01
Larry
попробуй перед AssignFile поставить {$I-}, а после завершения всего вернуть обратно {$I+} и не забывай CloseFile.
Автор: Larry
Дата сообщения: 05.07.2006 09:59
ShIvADeSt, спасибо, буду пробовать. CloseFile не забываю.
Автор: Anjin_Kazawa
Дата сообщения: 05.07.2006 10:08
Larry

Цитата:
Первый раз цикл for обрабатывается нормально, а во второй на команде Seek(f, i) уже слетает с ошибкой I/O Error 6. Подскажите, в чем может быть дело.

Заранее благодарен...


Код ошибки 6 - это "Неверный дескриптор файла" так что разбирайся что отдуда и как
Автор: greenpc
Дата сообщения: 05.07.2006 10:42
Larry
Ошибка написания Reset(f). Надо Reset(f, 1)
Если у тебя типизированный файл то может проще сделать через TStingList ?
а так вот смотри
[more]
var
Buffer : array[0..1024] of char;
BytesRead : DWORD;
In_F : File;
..........................

if OpenDialog1.Execute then begin
Reset(In_F, 1);
repeat
FillChar(Buffer, SizeOf(Buffer), 0); // не обязательно
BlockRead(In_f, Buffer, SizeOf(Buffer), BytesRead);
for i := 0 to BytesRead do begin
/// проверки
if Buffer[i]=.... then

end; // for
until BytesRead = 0;
CloseFile(In_f);


[/more]
Автор: ShIvADeSt
Дата сообщения: 05.07.2006 10:49
странно вот рабочий кусок

Цитата:

var
F: file of char;
i:integer;
A:array[1..4] of char;
begin
AssignFile(f, 'c:\Program Files\Mark\_ReadMe.txt');
Reset(f);
for i:=0 to FileSize(f)-4 do begin
Seek(f, i);
BlockRead(f, A, 4);
end;
CloseFile(F);
end;

проверял на текстовом файле - все работает, вначале проверь на каком нить реальном файле, а потом уже броузь на файл.
Автор: SERGE_BLIZNUK
Дата сообщения: 05.07.2006 11:16

Цитата:


Код:
for i:=0 to FileSize(f)-4 do begin
Seek(f, i);

Автор: Anjin_Kazawa
Дата сообщения: 05.07.2006 11:22
greenpc

Цитата:
Ошибка написания Reset(f). Надо Reset(f, 1)


Не путай человека,
Код: Reset(f, 1)
Автор: OOD
Дата сообщения: 05.07.2006 22:42
Проблема с TBrowser

Когда открываю страничьку через TBrowser или через IE происходит автоматическая активация TBrowser и установка курсора на первую позицию на сайте.... ну допустим вы зашли на сайт www.ya.ru и сразу курсос становиться на позицию поиска в яндексе, вы зашли на сайт http://www.google.com.ua/ тоже самое.... Если Вы нажмете курсором куда-либо на белом фоне гугля,тогда естественно курсор больше не станет на строку поиска и его нужно ставить в ручную ,или же ТАБ ом, но можно перезагрузить страцу и тогда он станет автоматическу туда, куда нужно , следовательно может быть какая-то процедура это делает по загрузке страници, или кто его знает

В моём приложении какая проблема запущен сайт в TBrowser , нажимаю какие либо кнопки на форме и TBrowser больше не активен - какие либо действия на сайте производить больше невозможно
TBrowser.Visible :=True; не помогает
Автор: ShIvADeSt
Дата сообщения: 06.07.2006 00:57
OOD
попробуй TBrowser.SetFocus в конце каждого нажатия, по идее должен возвращать фокус туда, где он был до нажатия кнопки.
Автор: OOD
Дата сообщения: 06.07.2006 01:16
ShIvADeSt
Дело в том, что браузер загружает страничьку , а не ней всегда находяться Java Script ы которые указывают браузеру его дальнейшие действия например на www.ya.ru

Код: document.web.text.focus();
Автор: greenpc
Дата сообщения: 06.07.2006 06:58
OOD
пробуй [more]
uses
ActiveX;

begin
WebBrowser1.Navigate('irgendeinedatei.html');
with WebBrowser1 do
if Document <> nil then
with Application as IOleobject do
DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle,
GetClientRect);
end;


или


uses
MSHTML;

begin
WebBrowser1.Navigate('irgendeinedatei.html');
repeat
Application.ProcessMessages;
until WebBrowser1.ReadyState >= READYSTATE_COMPLETE;
if WebBrowser1.Document <> nil then
(Webbrowser1.Document as IHTMLDocument2).ParentWindow.Focus;
end;
[/more]
Автор: rs
Дата сообщения: 06.07.2006 07:42
OOD

Цитата:
Проблема с TBrowser

TBrowser - это что за компонент? стороннего производителя?

у меня Delphi 5 - там есть только TWebBrowser - или TBrowser это борландовский вариант для более поздних версий дельфи?

если это отдельный продукт - где его можно скачать?
Автор: OOD
Дата сообщения: 06.07.2006 08:25
rsTWebBrowser компонент в 7делфи, полный аналог Internet Explorer, чтобы его установить нужно установить Microsoft Internet Controls (Version 1.1) из меню Component.

greenpcНет-это не помогает, пробовал
Код: TWebBrowser.SetFocusToDoc;
Автор: Betorgon
Дата сообщения: 06.07.2006 13:45
А как использовать свой собственный курсор?
Автор: RostY
Дата сообщения: 06.07.2006 15:59
LoadCursor, LoadCursorFromFile.
Например

Screen.Cursors[1]:=LoadCursorFromFile('$$$.ani');
Button1.Cursor:=1
Автор: Betorgon
Дата сообщения: 07.07.2006 23:46
Пасибо RostY
Автор: Larry
Дата сообщения: 08.07.2006 07:44
Есть форма. По нажатии на кнопку должна открываться новая форма, а старая закрываться. Как полностью передать управление приложением новой форме, чтобы по закрытии первой формы вся программа не закрывалась?

Заранее благодарен...
Автор: vserd
Дата сообщения: 08.07.2006 11:01
Larry

Цитата:
Как полностью передать управление приложением новой форме, чтобы по закрытии первой формы вся программа не закрывалась?

1. Создать скрытую ГЛАВНУЮ ФОРМУ которая не будет закрываться.
2. Не пробовал, но попробуй подменить главную форму в проекте.
Автор: paz0r
Дата сообщения: 08.07.2006 12:38
У меня проблема: хочу считать данные из файла находящегося на сайте. Использую для этого компонент idHTTP.
HTTP:=TIdHTTP.Create(nil);
HTTP.HandleRedirects:=True;
HTTP.ProtocolVersion:=pv1_0;
HTTP.ProtocolVersion:=pv1_0;
А что дальше не знаю, как вывести данные, допустим, 3 строки файла в Label? И из любого ли файла можно прочитать эти данные?
Автор: SERGE_BLIZNUK
Дата сообщения: 08.07.2006 12:41

Цитата:
По нажатии на кнопку должна открываться новая форма, а старая закрываться.

Предлагаю такой вариант
(у себя проверил, вроде работает... ;-)))
1) в проект добавляем две формы
2) в Project | Options удаляем Form2 из Auto-Create forms
3) в раздел implementation Unit1
добавляем
uses Unit2;
4) на кнопку на форме Form1
вешаем код
Application.CreateForm(TForm2, Form2);
Form2.Show;
FreeAndNil( Form1 )

5) в форме Form2 на событие Close вешаем код
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.Terminate
end;

всё...
P.S. а вообще странного хотите ;-))...
По правильному главная форма должна быть! Она может быть невидимой, но должна быть ...

Автор: Larry
Дата сообщения: 08.07.2006 13:20
SERGE_BLIZNUK, спасибо за совет.

Моя задача: есть приложение. В начале есть форма авторизации. Как в 1С. Выбираем тип учетки, имя пользователя и пароль. По идее, главная форма - окно программы. Но в начале должна быть форма авторизации.

Вот это я хочу.
Автор: Almaz
Дата сообщения: 08.07.2006 14:01
Larry

Цитата:
По идее, главная форма - окно программы

главная форма - первая форма приложения, созданная через Application.CreateForm()
By default, the form created by the first call to CreateForm in a project becomes the application’s main form.
один из способов:
редактируешь ручками файл Project_Name.dpr (вставляешь строчку)

Код: begin
Application.Initialize;
...
fmLogin := TfmLogin.Create(Application);
...
Application.CreateForm(TfmMainForm, fmMainMainForm);
...
Application.Run;
end
Автор: RomanTim
Дата сообщения: 08.07.2006 14:30
paz0r

Цитата:
У меня проблема: хочу считать данные из файла находящегося на сайте. Использую для этого компонент idHTTP.
А что дальше не знаю, как вывести данные, допустим, 3 строки файла в Label? И из любого ли файла можно прочитать эти данные?

s := HTTP.Get(URL);
И дальше с полученной строкой можешь делать все что хочешь. А из любого можно прочитать или нет - смотря что ты понимаешь под любым, все, к чему можно достучаться из IE, доступно и из программы
Автор: SERGE_BLIZNUK
Дата сообщения: 08.07.2006 16:19
Larry

Цитата:
Но в начале должна быть форма авторизации.

с этого и надо было начинать ;-)))

Almaz
полностью с вами согласен.
Только логичнее
Application.CreateForm вызывать в зависимости от успеха логина...

Единственное, расскажу, как у нас в реальном проекте сделано:
[more]


Код:
в main.dpr
...
GoodLogin := uzShowLoginForm(3);
if GoodLogin then
Application.CreateForm(TfmMainForm, fmMainMainForm);
;
...
Application.Run;
---
в модуле (unit) LoginProc.pas

function uzShowLoginForm(NumRetriesConst: integer): boolean;

ну и сама функция:

function uzShowLoginForm(NumRetriesConst: integer): Boolean;
var
PasswordDlg: TPasswordDlg;
begin
PasswordDlg := TPasswordDlg.Create(Application);
with PasswordDlg do
try
NumRetriesMax := NumRetriesConst;
NumRetries := 0;
LoginSuccess := FALSE;
ShowModal;
Result := LoginSuccess;
finally
Free;
end;
end;


Автор: Almaz
Дата сообщения: 08.07.2006 22:26
SERGE_BLIZNUK

Цитата:
Только логичнее Application.CreateForm вызывать в зависимости от успеха логина...

хотелось показать только сам механизм, без деталей
реализовать можно по-всякому, потому и поставил многоточие
например так (пользуюсь твоим кусочком кода):

Код: GoodLogin := uzShowLoginForm(3);
if not GoodLogin then
Exit;
// ниже - основная ветвь
Автор: OOD
Дата сообщения: 10.07.2006 07:45
Как построить механизм постоянного анализатора Memo на наличие определенного символа в нем?

т.е. если в мемо вносить в любую позицию определенный символ , значит произвести каку-либо операцию?

Пробую вот так:

[more]


memo1 содержит слово "Запись!"

var
i,j : integer;
begin
i := Pos('З',memo1.Text);
j := Pos('!',memo1.Text);
form1.Caption:= inttostr(i)+' '+ inttostr(j);
label1.Caption:=Copy(Memo1.text, i , j-i);
ShowMessage('Запись присутствует!');
[/more]
но не знаю как сделать тут условия для поиска с циколом т.е. пока слово "Запись!" существует в мемо, производить определенную операцию, когда оно исчезает, производить что-либо другое, но как это сделать?
Автор: SERGE_BLIZNUK
Дата сообщения: 10.07.2006 08:26

Цитата:
пока слово "Запись!" существует в мемо, производить определенную операцию

вешайся на onChange и анализируй, анализируй... ;-))))
например, так:

Код:
procedure TForm1.Memo1Change(Sender: TObject);
begin
if Pos('Запись!', Memo1.Text)>0 then Label1.Caption := 'есть '
else Label1.Caption := 'нет '
end;
Автор: FireZone
Дата сообщения: 10.07.2006 08:33
OOD
Ну и формулировки. Толком не понял, что нужно. Вот накидал тебе несколько функций. Думаю, поясления не требуются.
[more]
Код: function SearchStrInMemo(M: TMemo; const S: String; out x, y: Integer): Boolean;
var
i: Integer;
begin
result := False;
for i := 0 to M.Lines.Count - 1 do begin
x := Pos(S, M.Lines[i]);
result := x > 0;
if result then begin
y := i + 1;
break
end
end;
end;

function IsMemoContainsStr(M: TMemo; const S: String): Boolean;
begin
result := Pos(s, M.Text) > 0
end;

function GetSymbolFromMemo(M: TMemo; x, y: Integer; out c: Char): Boolean;
begin
result := (y <= M.Lines.Count) and (x <= Length(M.Lines[y-1]));
if result then c := M.Lines[y-1][x]
end;
Автор: OOD
Дата сообщения: 10.07.2006 10:08
SERGE_BLIZNUK
FireZone
Класс как всё просто !Спасибо приогромнейшее
Добавил к этому всему ещё компонент SpVoice из Microsoft Speech Object Library (Version 5.1), правда не на русском, а на английском, но всё же умеет проговаривать содержимое мемо -очень приятно , при написании программ всяких , например чатов

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.