|
|
Регистрация | << Правила форума >> | 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
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |