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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2016, 14:44   #1
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
Сообщение Memo как командная строка

Суть такова: имеется форма, на ней Memo, кнопка и канва.
В мемо вводим команды (влево 10, вперед 25, стоять 5 и т.д.), после чего нажимается кнопка и на канве идет графическое отображение всего введенного.
Не могу понять, как увязать команды с этими отображениями
Команды пишутся в столбик, по одной в строке, т.е. "команда [пробел] цифра", цифра означает расстояние или в качестве стоять/стоп - секунды.
Нужно отрабатывать сначала первую строку, потом вторую и т.д. - по сути получается алгоритм движения на канве заранее прописывается в мемо.

В общем, кто чем сможет...
vers0 вне форума Ответить с цитированием
Старый 11.03.2016, 15:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Memo.Lines для последовательного чтения строк из Memo
Canvas.MoveTo для установки пера в нужную позицию
Canvas.LineTo рисует линию
StrToInt строку в интежер
Включить процессор в голове
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2016, 15:15   #3
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

сделай команда=число загружай текст из мемо в TStringList там у тебя поулчится список Name=Value, циклом по Names проходишься и Caseом выполняешь нужную команду, по моему все сказал.
Готовый код вроде бы не просили.
IvaniuS вне форума Ответить с цитированием
Старый 11.03.2016, 15:17   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

точно.
добавлю.
паузу ("стоять") можно организовать по разному.
варианты можно посмотреть в теме Аналог Sleep()
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.03.2016, 15:38   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для паузы в первом приближении и sleep пройдет. Таймер для развития технологии, поток для второй очереди развития
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.03.2016, 10:05   #6
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
По умолчанию

IvaniuS, благодарю, с числами легче, так и хотел, но загвоздка именно в увязке команды с меняющимся значением после нее

Цитата:
Сообщение от IvaniuS Посмотреть сообщение
циклом по Names проходишься и Caseом выполняешь нужную команду
пример перебора каждой строки на наличие команд можно (желательно со значениями)?
vers0 вне форума Ответить с цитированием
Старый 12.03.2016, 13:14   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

например,
Код:
var s,Command: string;
  i,Param : integer;
begin
 for i:=0 to Memo1.Lines.Count-1 do begin
   s:=Trim(Memo1.Lines[i]);
   if Pos(' ',s)>0 then begin {если в строке есть пробел, тогда}
     Command:=AnsiUpperCase(Copy(s,1,Pos(' ',s)-1));
     Param:=StrToIntDef(Copy(s,Pos(' ',s)+1,Length(s)),0);
     if Command='ВЛЕВО' then begin
        ShowMessage('Делай команду '+Command+ ' с параметром '+IntToStr(Param));
     end;
     if Command='ВПРАВО' then begin
        ShowMessage('Делай команду '+Command+ ' с параметром '+IntToStr(Param));
     end;
     if Command='СТОЯТЬ' then begin
        ShowMessage('Делай команду '+Command+ ' с параметром '+IntToStr(Param));
     end;
     .....
   end;
 end;
end;

код примерно условный, я не проверял, написал прямо здесь.
нужно проверять, возможно поправлять/отлаживать...

Последний раз редактировалось Serge_Bliznykov; 12.03.2016 в 13:23.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.03.2016, 13:23   #8
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Почему бы и нет. Вариант с If выглядит лучше и имеет место быть, это то что я имел ввиду.
Текст в мемо
Цитата:
left=10
forw=25
stop=5
Написал на коленке, но должно рабоать, смысл думаю понятен
Код:
procedure TForm1.DoPaint(act:string;val:Integer);
begin
  case act[1] of
    'l':begin//left
            MyCanvas.MoveTo();
            MyCanvas.LineTo();
        end;
    'r':;//right
    'f':;//forward
    'b':;//backward
    's':;//stop
  end;
end;

procedure TForm1.btnStartClick(Sender: TObject);
var
  i:Integer;
begin
  with TStringList.Create do
  try
    Text:=mmoCode.Lines.Text;
    for I := 0 to count-1 do
      DoPaint(AnsiLowerCase(Names[i]),StrToInt(ValueFromIndex[i]));
  finally
    free;
  end;
end;
Когда дописал - понял что не учел обе координаты т.е. нужно будет добавить проверку на наличие запятой в ValueFromIndex и разбить через pos\copy до запятой и после, если это координаты.

Последний раз редактировалось IvaniuS; 12.03.2016 в 13:26.
IvaniuS вне форума Ответить с цитированием
Старый 13.03.2016, 09:35   #9
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
По умолчанию

благодарю, нужны были как раз идеи, т.к. не имея опыта и знаний фантазию особо не применишь.

Не написали б о втором параметре, не спросил бы ))) Если добавить второй параметр вида "переместить 5 8"?

Код:
begin
 for i:=0 to Memo1.Lines.Count-1 do begin
   s:=Trim(Memo1.Lines[i]);
   if Pos(' ',s)>0 then begin {если в строке есть пробел, тогда}
     Command:=AnsiUpperCase(Copy(s,1,Pos(' ',s)-1));
     Param:=StrToIntDef(Copy(s,Pos(' ',s)+1,Length(s)),0);
???
     Param2:=StrToIntDef(Copy(k,Pos(' ',k)+1,Length(k)),0);

Последний раз редактировалось vers0; 13.03.2016 в 09:48.
vers0 вне форума Ответить с цитированием
Старый 13.03.2016, 10:37   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Не написали б о втором параметре, не спросил бы
я про второй параметр ничего не писал!

Цитата:
Если добавить второй параметр вида "переместить 5 8"?
вариантов много. я бы лично выбрал разбор строки через PosEx (искать в строке, начиная от предыдущего поиска).
Можно ещё в переменную копировать часть строки и искать пробел в ней.
Можно ещё удалять обработанную часть (самый неэффективный вариант, но в качестве костыля вполне подойдёт: условно говоря, будет код разбора работать не 0.01 секунды, в пять раз дольше - 0.05 с

С PosEx пример напишете самостоятельно или нужна помощь?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Командная строка в С++ Артём Волжанкин Помощь студентам 1 17.12.2012 01:00
Папка не открывается, а открывается командная строка, как исправить? Серёга07 Свободное общение 4 09.11.2012 22:30
Командная строка RgnRok Общие вопросы C/C++ 10 25.01.2011 18:42
Командная строка Morphling Помощь студентам 9 01.02.2010 00:27
Командная строка Vladya Помощь студентам 4 09.02.2009 18:29