Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.03.2008, 12:10
DeadMan89 DeadMan89 вне форума
Прохожий
 
Регистрация: 22.03.2008
Сообщения: 9
Репутация: 10
По умолчанию Помогите,очень срочно

Вообщем пишу бота, когда приходит запрос он должен из файла найти данную строку и отправить ее адресату, знак разделителя ; (пример: Вопрос1;Ответ1).Заранее спасибо!
Ответить с цитированием
  #2  
Старый 22.03.2008, 13:46
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Из вопроса непонятно, в чем у вас затруднения: вы не знаете как найти строку в файле? или как ее разделить? или как отправить ответ?
Ответить с цитированием
  #3  
Старый 23.03.2008, 16:37
DeadMan89 DeadMan89 вне форума
Прохожий
 
Регистрация: 22.03.2008
Сообщения: 9
Репутация: 10
По умолчанию

на самом деле у меня с файлами вообще труба, ничего мне не понятно,вообще ничего написать не могу
Ответить с цитированием
  #4  
Старый 23.03.2008, 16:44
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Если файл текстовый и вам его нужно только читать, то можно его просто загрузить в TStringList и работать со списком строк:
Код:
var
  StrList: TStringList;
begin
  StrList := TStringList.Create;
  StrList.LoadFromFile(<имя_файла>);
  { Дальше работаете со строками файла.
    К ним можно обращаться по индексу: StrList[0], StrList[1] 
    или же StrList[i] и т.п.} 
  ...
  { В конце освобождаете объект списка }
  StrList.Free;
end;
Ответить с цитированием
  #5  
Старый 23.03.2008, 16:48
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Разделить строку по точке с запятой можно так:
Код:
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;
После выполнения функции в SubStr1 будет часть строки до точки с запятой, в SubStr2 - часть строки после. Если точки с запятой в строке нет, то функция вернет False, иначе (если удалось разделить строку) - True.
Ответить с цитированием
  #6  
Старый 23.03.2008, 17:12
Brute Force Brute Force вне форума
Прохожий
 
Регистрация: 21.03.2008
Сообщения: 15
Репутация: 10
По умолчанию

А почему строку не с нулевого символа копируете, а с 1?
Вот здесь: SubStr1 := Copy(SourceStr, 1, i - 1);
Ответить с цитированием
  #7  
Старый 23.03.2008, 17:24
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от Brute Force
А почему строку не с нулевого символа копируете, а с 1?
Потому что это правильно.
Ответить с цитированием
  #8  
Старый 23.03.2008, 18:28
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Счастье

Цитата:
Сообщение от Brute Force
А почему строку не с нулевого символа копируете, а с 1?
Вот здесь: SubStr1 := Copy(SourceStr, 1, i - 1);
Если взглянуть на строку данного типа в памяти машины, то можно
увидеть, что в нулевом символе храниться длинна строки. Получается, что если прочитатьзначение нулевого символа SubStr1[0], то мы получим строку!!! Возможно так, но прямое обращение к нулевому символу не желательно, особенно не стоит его изменять.
Из книги "Библия Delphi"
__________________
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей
Ответить с цитированием
  #9  
Старый 23.03.2008, 19:36
DeadMan89 DeadMan89 вне форума
Прохожий
 
Регистрация: 22.03.2008
Сообщения: 9
Репутация: 10
По умолчанию

как эту процедуру переделать что бы она с файлом работала?и высылала ответ после ; , используя 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  
Старый 24.03.2008, 02:57
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от Oleg
Если взглянуть на строку данного типа в памяти машины, то можно
увидеть, что в нулевом символе храниться длинна строки. Получается, что если прочитатьзначение нулевого символа SubStr1[0], то мы получим строку!!! Возможно так, но прямое обращение к нулевому символу не желательно, особенно не стоит его изменять.
Из книги "Библия Delphi"
Это малость не о тех строках. AnsiString может содержать до 2Gb текста, такое значение, конечно, в 1 байте не поместится. Если есть желание разобраться со строками в Delphi, рекомендую хорошую статью Антона Григорьева "Тонкости работы со строками", там очень внятно изложено все.
Ответить с цитированием
  #11  
Старый 24.03.2008, 03:03
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Цитата:
Сообщение от DeadMan89
как эту процедуру переделать что бы она с файлом работала?и высылала ответ после ; , используя OpenDialog для открытия файла
Напишите словами чего вы хотите от процедуры. Из кода это неочевидно.
Ответить с цитированием
  #12  
Старый 24.03.2008, 15:43
DeadMan89 DeadMan89 вне форума
Прохожий
 
Регистрация: 22.03.2008
Сообщения: 9
Репутация: 10
По умолчанию

вообщем я хочу что бы при запросе из файла искалось это слово и ответ передавался впеременную, а та высылалась на аську кто запрос давал
Ответить с цитированием
  #13  
Старый 24.03.2008, 17:08
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Примерно так. Писал прямо здесь, могут быть синтаксические ошибки. Функцию 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  
Старый 24.03.2008, 17:51
DeadMan89 DeadMan89 вне форума
Прохожий
 
Регистрация: 22.03.2008
Сообщения: 9
Репутация: 10
По умолчанию

при компиляции пишет Procedure cannot have a result type
Ответить с цитированием
  #15  
Старый 24.03.2008, 17:56
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Поменяй слово procedure на function
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter