Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2009, 21:01   #11
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

+Очень извеняюсь, но то был не последний мой вопрос...
С вводом Memo1 пришла новая проблема: текст который состоит из более чем одной строки не сохраняеться, всмысле сохраняеться только первая строка, что в данном случаи не позволительно, знаю что луче использовать Edit, ну так Edit тоже многострочный текст не поддерживает...
Как можно это исправить, ну или сделать сохранение каждой ячейки в отдельный файл и при создании Form1 загрузить все имеющиеся файлы из папки Data (например), которые имеют в имени координаты ячейки (например: 1,2.txt), при этом заполнив текстом из них те самые ячейки...

ЗЫ: еще раз ивиняюсь)
W0LF вне форума Ответить с цитированием
Старый 07.07.2009, 23:46   #12
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Зачем изобретать велосипед?
Допиши этот код в Form3
Код:
 
unit Unit3;
...
public
    str: String;
...
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: Integer;
begin
  // Удаление пустых строк
  while Memo1.Lines.Strings[Memo1.Lines.Count-1] = '' do
    Memo1.Lines.Delete(Memo1.Lines.Count-1);
  while Memo1.Lines.Strings[0] = '' do Memo1.Lines.Delete(0);

  // Склеивание нескольких строк в одну.
  for i := 0 to Memo1.Lines.Count - 1 do
    str := str + Memo1.Lines.Strings[i] + ' ';
end;
Хранить в каждом файле содержимое ячеек смысла нет. Все равно StringGrid не умеет отображать данные в несколько строк.

пс. Если есть еще вопросы, сразу все напиши!
psycho-coder вне форума Ответить с цитированием
Старый 08.07.2009, 16:07   #13
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

psycho-coder мне надо что бы отправлялся многострочный текст, даже и с путсыми строками, я знаю что StringGrid его не отображает, но мне надо что бы такой текст гдето хранился... может сделать один столбик с тексом (на который бот дожлен ответить) а при клике на него в Form3 в мемо ввести текст который бот и отправит... Не сохраняючи его в соседнюю строку, но получаеться всеравно надо сохранить его куда либо... Вот яи подумал что сохранить разные файлы, которые будут грузитья( ну не в ячейку, а в Memo например при дабл-клике на строку с !help(например), а одиночный клик будет изменять именно текст данной ячейки)... Знаю ужасно за умно, но мне очень надо что бы можно было вводить многострочный текст и на запрос отвечать именно им, а не одной строкой....


Последний раз редактировалось W0LF; 08.07.2009 в 16:16.
W0LF вне форума Ответить с цитированием
Старый 08.07.2009, 16:12   #14
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Можно в строке, которая должна быть много строчной, добавить символ #0 - он будет определять конец строки, а при отправке сообщения (ответа бота), конвертировать строку в многострочное. Это на мой взгляд проще.
Если так тебя устроит то могу функцию написать. Если нет буду думать над твоим предложением
psycho-coder вне форума Ответить с цитированием
Старый 08.07.2009, 16:36   #15
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Ну незнаю, если это проще будет томожно. Это типа: ввел в мемо текст, сохранил, но оно его сохраняет в одну строку? А при ответе ботом текст будет как оригинальный, с строками и т.д? Если так, буду благодарен за функцию ту...
W0LF вне форума Ответить с цитированием
Старый 08.07.2009, 16:57   #16
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Да. Именно так
psycho-coder вне форума Ответить с цитированием
Старый 08.07.2009, 18:36   #17
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Измени TForm3.FormClose к такому виду - форма с Memo

Код:
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: Integer;
const
  endString: Char = #3;
begin
  while Memo1.Lines.Strings[Memo1.Lines.Count-1] = '' do
    Memo1.Lines.Delete(Memo1.Lines.Count-1);
  while Memo1.Lines.Strings[0] = '' do Memo1.Lines.Delete(0);

  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    if i = Memo1.Lines.Count - 1 then
    begin  // Проверяем, если это последнее слово, то к нему разделитель не нужен
      str := str + Memo1.Lines.Strings[i];
      Exit;
    end;
    str := str + Memo1.Lines.Strings[i]+endString; // разделитель endString
  end;
end;
А вот функция перевода:
Код:
function ManyStr(Str: String): String;
var
  Len, i: Integer;
const
  controlChar: Char = #3; // Символ "Конца текста" в таблице ASCII
  replaceChars: String = #13+#10; // Обрыв строки и Перевод каретки (спецификация Windows)
begin
  Result := '';
  Len := Length(Str);

  // Если разделителя нет, значит это обычная строка
  if Pos(controlChar, Str) = 0 then
  begin
    Result := Str; // Возвращаем ее же
    Exit;
  end;

  // Копируем посимвольно
  for i := 1 to Len do
    if Str[i] = controlChar then // Если разделитель, то ...
    begin
      Result := Result + replaceChars; // ... берем строку до символа #3 и на его место вставляем символы #13+#10
      Continue; // и заново
    end
    else // Иначе просто копируем символ
      Result := Result + Str[i];  
end;
Использовать так
Код:
procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
  _left, _top: Integer;
begin
  _left := StringGrid1.Selection.Left; // Выделенная ячейка слева
  _top := StringGrid1.Selection.Top; // Выделенная ячейка сверху
  if (_left < 1) and (_top < 1) then Exit; // Если они меньше 0 то это не наше

  // Загружаем в Memo1 текст из выделенной ячейки пропущенный через функцию.
  Form3.Memo1.Text := ManyStr(StringGrid1.Cells[_left, _top]);
  Form3.Caption := 'Ячейка['+IntToStr(_left)+','+IntToStr(_top)+']'; // Заголовок
  Form3.ShowModal; // Отображаем как модкальное окно
  StringGrid1.Cells[_left, _top] := Form3.str; // Загружаем в ячейку текст
end;
В общем при отправке сообщения ботом это будет примерно так (Pidgin Pascal)
Код:
  ICQSendMessage(ManyStr(StringGrid1.Cells[2, 2])); // пример.
на скрне пример
Изображения
Тип файла: png teststr.PNG (18.6 Кб, 37 просмотров)
psycho-coder вне форума Ответить с цитированием
Старый 08.07.2009, 19:36   #18
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Можно заменить
Код:
function ManyStr(Str: String): String;
var
  Len, i: Integer;
const
  controlChar: Char = #3; // Символ "Конца текста" в таблице ASCII
  replaceChars: String = #13+#10; // Обрыв строки и Перевод каретки (спецификация Windows)
begin
  Result := '';
  Len := Length(Str);

  // Если разделителя нет, значит это обычная строка
  if Pos(controlChar, Str) = 0 then
  begin
    Result := Str; // Возвращаем ее же
    Exit;
  end;

  // Копируем посимвольно
  for i := 1 to Len do
    if Str[i] = controlChar then // Если разделитель, то ...
    begin
      Result := Result + replaceChars; // ... берем строку до символа #3 и на его место вставляем символы #13+#10
      Continue; // и заново
    end
    else // Иначе просто копируем символ
      Result := Result + Str[i];  
end;
одной строкой(S - будет к примеру входная строка)
Код:
 Form3.Memo1.Text := StringReplace(s, #3, #13#10, [rfReplaceAll, rfIgnoreCase]);

Последний раз редактировалось Alter; 08.07.2009 в 19:40.
Alter вне форума Ответить с цитированием
Старый 08.07.2009, 20:08   #19
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

извините, у меня нечего не выходит... (( постоянныйе ошибки + толком не могу понять куда его сувать).. отпишите плиз мне на аську и если можете обясните норм (uin: 4122177)

ругаеться на 2 строки psycho-coder'а: а именно на

->> str := str + Memo1.Lines.Strings[i];
Exit;
end;
->> str := str + Memo1.Lines.Strings[i]+endString;


([Error] Unit3.pas(55): '(' expected but ':=' found)

Последний раз редактировалось W0LF; 08.07.2009 в 20:27.
W0LF вне форума Ответить с цитированием
Старый 08.07.2009, 20:26   #20
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Изменил имеющийся текст тут и всё:
Код:
procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
  _left, _top: Integer;
begin
  _left := StringGrid1.Selection.Left; // Выделенная ячейка слева
  _top := StringGrid1.Selection.Top; // Выделенная ячейка сверху
  if (_left < 1) and (_top < 1) then Exit; // Если они меньше 0 то это не наше

  // Загружаем в Memo1 текст из выделенной ячейки пропущенный через функцию.
  Form3.Memo1.Text := StringReplace(StringGrid1.Cells[_left, _top], #3, #13#10, [rfReplaceAll, rfIgnoreCase]);  
  Form3.Caption := 'Ячейка['+IntToStr(_left)+','+IntToStr(_top)+']'; // Заголовок
  Form3.ShowModal; // Отображаем как модкальное окно
  StringGrid1.Cells[_left, _top] := Form3.str; // Загружаем в ячейку текст
end;

ICQSendMessage(StringReplace(StringGrid1.Cells[2, 2], , #3, #13#10, [rfReplaceAll, rfIgnoreCase])); // пример.
Про пост #19 -> Var Str :String;

Последний раз редактировалось Alter; 08.07.2009 в 20:33.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со StringGrid'ом Rusl92 Общие вопросы Delphi 1 25.11.2008 23:54
Проблема со StringGrid'ом monushka Компоненты Delphi 8 31.10.2007 15:13
Помогите, пожалуйста, со StringGrid'ом! monushka Помощь студентам 3 27.10.2007 19:17