![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Вообщем пишу бота, когда приходит запрос он должен из файла найти данную строку и отправить ее адресату, знак разделителя ; (пример: Вопрос1;Ответ1).Заранее спасибо!
|
|
#2
|
|||
|
|||
|
Из вопроса непонятно, в чем у вас затруднения: вы не знаете как найти строку в файле? или как ее разделить? или как отправить ответ?
|
|
#3
|
|||
|
|||
|
на самом деле у меня с файлами вообще труба, ничего мне не понятно,вообще ничего написать не могу
|
|
#4
|
|||
|
|||
|
Если файл текстовый и вам его нужно только читать, то можно его просто загрузить в TStringList и работать со списком строк:
Код:
var
StrList: TStringList;
begin
StrList := TStringList.Create;
StrList.LoadFromFile(<имя_файла>);
{ Дальше работаете со строками файла.
К ним можно обращаться по индексу: StrList[0], StrList[1]
или же StrList[i] и т.п.}
...
{ В конце освобождаете объект списка }
StrList.Free;
end; |
|
#5
|
|||
|
|||
|
Разделить строку по точке с запятой можно так:
Код:
function DivStr(const SourceStr: String; var SubStr1, SubStr2: String): Boolean;
var
i: Integer;
begin
i := Pos(';', SourceStr);
if i <> 0 then begin
SubStr1 := Copy(SourceStr, 1, i - 1);
SubStr2 := Copy(SourceStr, i + 1, Length(SourceStr) - i);
end;
Result := i <> 0;
end; |
|
#6
|
|||
|
|||
|
А почему строку не с нулевого символа копируете, а с 1?
Вот здесь: SubStr1 := Copy(SourceStr, 1, i - 1); |
|
#7
|
|||
|
|||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Цитата:
увидеть, что в нулевом символе храниться длинна строки. Получается, что если прочитатьзначение нулевого символа SubStr1[0], то мы получим строку!!! Возможно так, но прямое обращение к нулевому символу не желательно, особенно не стоит его изменять. Из книги "Библия Delphi" |
|
#9
|
|||
|
|||
|
как эту процедуру переделать что бы она с файлом работала?и высылала ответ после ; , используя OpenDialog для открытия файла, заранее спасибо
Код:
procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
begin
Memo1.Lines.Add('('+(DateToStr(Date))+' ('+(TimeToStr(Time))+'))');
Memo1.Lines.Add(' '+UIN+': ' + msg);
Memo1.Lines.Add('');
Edit6.text:=(UIN);
if msg='Запрос' then
ICQClient1.SendMessage((StrToInt(UIN)),'Ответный символ');
end;Admin: Теги и еще раз теги! Последний раз редактировалось Admin, 23.03.2008 в 20:43. |
|
#10
|
|||
|
|||
|
Цитата:
|
|
#11
|
|||
|
|||
|
Цитата:
|
|
#12
|
|||
|
|||
|
вообщем я хочу что бы при запросе из файла искалось это слово и ответ передавался впеременную, а та высылалась на аську кто запрос давал
|
|
#13
|
|||
|
|||
|
Примерно так. Писал прямо здесь, могут быть синтаксические ошибки. Функцию DivStr я писал несколькими постами выше.
В GetAnswer передаете вопрос, возвращается ответ, если он есть в файле, если нет - возвращается пустая строка. Код:
procedure GetAnswer(SQuestion: String): String;
var
Dlg: TOpenDialog;
FileStrings: TStringList;
SFileName: String;
function FindAnswer: String;
var
i: Integer;
S1, S2: String;
begin
Result := '';
for i := 0 to FileStrings.Count - 1 do
if DivStr(FileStrings[i], S1, S2) then
if AnsiCompareText(SQuestion, S1) = 0 then begin
Result := S2;
Exit;
end;
end;
begin
Result := '';
Dlg := TOpenDialog.Create(Application);
try
if Dlg.Execute
then SFileName := Dlg.FileName
else SFileName := '';
finally
Dlg.Free;
end;
if Length(SFileName) = 0 then Exit;
FileStrings := TStringList.Create;
try
FileStrings.LoadFromFile(SFileName);
Result := FindAnswer;
finally
FileStrings.Free;
end;
end; |
|
#14
|
|||
|
|||
|
при компиляции пишет Procedure cannot have a result type
|
|
#15
|
||||
|
||||
|
Поменяй слово procedure на function
|