Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

Терминал на канве   Найти похожие ветки 

 
DmT   (2008-05-28 11:22) [0]

Суть такая:
Надо рисовать на канве терминал(командную строку)
при этом чтобы можно было прокручивать текст
текст моноширинный.


 
clickmaker ©   (2008-05-28 11:25) [1]

а не проще ее в Memo выводить?


 
DmT   (2008-05-28 11:30) [2]

Еслиб можно было на мемо выводить, я бы не спрашивал ;-)
ну по сути сейчас все сводится к тому что мне надо получить строку номер которой задан в переменной(ну назавем Pos).
при этом стоит учесть что одна сторока может не влазить на одну "экранную " строку, и тогда она займет большее кол-во строк.


 
Palladin ©   (2008-05-28 11:32) [3]

а, представляешь, в мемо так и есть, сколько бы линий на экране не занимала строка при включеном WordWrap индекс у нее будет один


 
DmT   (2008-05-28 11:50) [4]

да мне по барабану на мемо! мне вообще нельзя использовать компоненты!
Все что есть - канва и рисование. и из этого надо слепить командную строку типа bash или cmd


 
Palladin ©   (2008-05-28 11:52) [5]

и чего ты тогда хочешь"то? кода готового? волшебного пендаля? с какой целью твой пост возник? даже вопроса нет, некий поток сознания


 
DmT   (2008-05-28 11:56) [6]


> ну по сути сейчас все сводится к тому что мне надо получить
> строку номер которой задан в переменной(ну назавем Pos).
> при этом стоит учесть что одна сторока может не влазить
> на одну "экранную " строку, и тогда она займет большее кол-во строк.

вот что мне надо.


 
DiamondShark ©   (2008-05-28 12:25) [7]


> вот что мне надо.

Надо -- делай.
А телепаты в отпуске, поэтому тут никто не в курсе, откуда и каким образом у тебя надо получить строку, номер чего в чём у тебя задан и откуда у тебя взялась канва при запрете на компоненты.

Если вся проблема в том, как нарисовать строку на канве, то втыкай  в функцию DrawText, она и рисует, и перенос делает и расчёт высоты и ширины строк производит.

Если это не то, что ты хотел, то потрудись выражать свои мысли яснее. То, что ты тут написал, хоть и похоже на русский текст, но смысла имеет очень мало.


 
DmT   (2008-05-28 12:32) [8]

контролов нет по тому что это будет переноситься на мобилу(на си)
А прошу тут, просто потому что это один из лучших форумов по программированию.
DrawText не подходит.
вот чисто примерное описание нужного терминала
type
   TTerminal=class(TObject)
   Left,Top:integer;     //тут
   Heigth,Width:integer;  //и тут все понятно
   Text:string;        //собсно текст терминала
   Pos:integer;       //номер строки которая выводится в самом низу выделенной области(ну или с небольшим отступом)
   private
       {...}
   public
       {...}
   end;


 
Умище   (2008-05-28 12:54) [9]


> DmT   (28.05.08 12:32) [8]


Стандартный подход - для каждой строки/объекта, которые выводятся на канву, создаётся структура, в которой хранятся все атрибуты, в том числе и текущие координаты объекта на канве.


 
DiamondShark ©   (2008-05-28 12:58) [10]


> контролов нет по тому что это будет переноситься на мобилу(на
> си)
> А прошу тут, просто потому что это один из лучших форумов
> по программированию.

Дешёвая лесть тебе не поможет, потому что этот форум хоть и один из лучших по программированию, но программируют тут преимущественно на Дельфи под Винду на ПК, а не на си на мобилу.

Но -- фигня. Тут ещё и одни из лучших телепатов и пытателей партизан. Видишь, не прошло и трёх постов, как ты раскололся и про си, и про мобилу.

Продолжим пытать, или сам расскажешь, что за мобила, какой у неё API?
Сам-то пробовал её API поизучать? Мысли возникали?

Надеюсь, ты понимаешь, что с такой постановкой: "написать чего-то для какой-то там безымянной мобилы" тебе мало кто поможет?


 
DmT   (2008-05-28 13:13) [11]

Да я и не скрывался. И кстати лесть тут не причем.
На мобилах Siemens, Motorola, SonyEricsson появилась такая фича - Elf Pack
http://ru.wikipedia.org/wiki/Executable_and_Linkable_Format
Конкретно я пишу для моторолы. и на си перепишу сам.
API полностью не раскрыт, но его уже достаточно для создания подобного приложения. ну канва, фс и системные ф-и есть + куча всяких других ф-й.
Сам по себе терминал хотелось бы оформить в лучших традициях =)
Цель - вывод отладочной информации + тестово-исполнительная часть. ну и функции работы с фс.

на этом надеюсь флуд закончен.


 
Плохиш ©   (2008-05-28 13:17) [12]


> DmT   (28.05.08 11:22)  
> Суть такая:
> Надо рисовать на канве терминал(командную строку)


> DmT   (28.05.08 12:32) [8]
> контролов нет по тому что это будет переноситься на мобилу(на
> си)

Есть подозрение, что мобилу можно будет выбрасывать после первого же запуска этой чудо поделки горе-кодера... И вообще какой-то длинный и тернистый путь ты выбрал для реализации бесполезной фичи, хотя бы потому, что API у мобилы и виндовс для PC отличаются, сначала убъёшь несколько лет своей драгоценной жизни на реализацию того, что, возможно, в API мобилы делается одной функцией...


 
Умище   (2008-05-28 13:20) [13]

Удалено модератором


 
DmT   (2008-05-28 13:20) [14]

Удалено модератором


 
DiamondShark ©   (2008-05-28 14:02) [15]

Удалено модератором


 
DiamondShark ©   (2008-05-28 14:03) [16]

Ты действительно не понимаешь, что реализация твоей задачи зависит от того, какие примитивы доступны в твоём "непольностью раскрытом" API?
А эту информацию из тебя приходится клещами вытягивать, хотя это именно ТЫ должен был её максимально подробно изложить.

Допустим, в твоём API есть такие примитивы: "Определить размеры видимой части канвы", "Вывести строку (символ) в заданную позицию", "Определить размеры строки (символа)".
В этом случае твоя задача -- дедсадовская задачка на алгоритмирование.

Есть у тебя такие примитивы? Если есть, в чём проблема?
Рассказывай, что ты пытался делать, и в чём трудность?


 
Умище   (2008-05-28 14:06) [17]

Удалено модератором


 
DmT   (2008-05-28 21:14) [18]

Вся возможная работа с канвой имеется.
Т.е. получить длинну строки, размеры канвы и т.д.
вообщем вот:

/*******************************/

//создать Canvas
UIS_DIALOG_T UIS_CreateColorCanvas( SU_PORT_T  *port,
                      DRAWING_BUFFER_T * drawing_buffer,
                      BOOL use_soft_icon_area );

/* Цвета поумолчанию      
BackgroundColor - white
FillColor  - white
ForegroundColor  - blue
*/        
       
/*******************************/    

//  рисует  линию      
void UIS_CanvasDrawLine(GRAPHIC_POINT_T begin,
                       GRAPHIC_POINT_T end,
     UIS_DIALOG_T handle);    

// рисует закрашенный прямоугольник
void UIS_CanvasFillRect(GRAPHIC_REGION_T region,
                       UIS_DIALOG_T handle);

//  рисует прямоугольник    
void UIS_CanvasDrawRect(GRAPHIC_REGION_T region,
                       BOOL fill, //  заливка
                       UIS_DIALOG_T handle);

// рисует закруглённый прямоугольник    
void UIS_CanvasDrawRoundRect(GRAPHIC_REGION_T region,  
      UINT16 arcW, // горизонтальный диаметр скругления
      UINT16 arcH, // вертикальный диаметр скругления
      BOOL fill,
      UIS_DIALOG_T handle);      

// рисует дугу окружности или эллипса
void UIS_CanvasDrawArc(GRAPHIC_REGION_T region,
     UINT16 startAngle,    // начальный угол.
     UINT16 arcAngle,   // конечный угол
     BOOL fill,
     UIS_DIALOG_T handle);
   
// рисует многоугольник    
void UIS_CanvasDrawPoly(UINT16 number_of_vertices,
     GRAPHIC_POINT_T  *array,
     BOOL fill,
     UIS_DIALOG_T handle);
     
/*******************************/

// рисует строку      
void UIS_CanvasDrawColorText( WCHAR *string,
        UINT16 offset,
        UINT16 strlen,        // длинна строки
        GRAPHIC_POINT_T anchor_point, // координаты точки привязки
        UINT16 anchor_value,     // значение точки привязки. Например: ANCHOR_LEFT | ANCHOR_TOP
        UIS_DIALOG_T handle);
       
// задаёт шрифт
UINT32 UIS_CanvasSetFont( UINT8 font_id, // 0 - NetMonitor, 1- General Font... загляните в MotoLangEditor
       UIS_DIALOG_T handle);


//возвращает стиль шрифта
UINT8 UIS_CanvasGetFontStyle(UIS_DIALOG_T handle);  
// задает стиль шрифта      
UINT32 UIS_CanvasSetFontStyle(UINT8 font_style, UIS_DIALOG_T handle);    
     

// возвращает размер строки
UINT32 UIS_CanvasGetStringSize( WCHAR * str,
       GRAPHIC_METRIC_T * string_size, // размер строки
       UINT8 font_id );
// размер шрифта        
UINT32 UIS_CanvasGetFontSize ( UINT8 font_id, GRAPHIC_METRIC_T * font_size);        
     
/*******************************/

// рисует картику    
UINT32 UIS_CanvasDrawImage(UINT8 picture_type,   // тип. откуда будем брать картинку. DRM, файл....
        PICTURE_TYPE_UNION_T picture_data,
        GRAPHIC_POINT_T anchor_point,
        UINT16 anchor_value,
        UINT8 drawOp,
        UIS_DIALOG_T handle);

UINT32 UIS_CanvasDrawWallpaper(CANVAS_IMAGE_HANDLE_T image_handle,
         GRAPHIC_REGION_T srcArea,
         GRAPHIC_REGION_T destRegion,
         UINT8 drawOp,
         WALLPAPER_LAYOUT_T layout,
         UIS_DIALOG_T handle);  


// открывает картинку      
CANVAS_IMAGE_HANDLE_T UIS_CanvasOpenImage(UINT8 picture_type,
           PICTURE_TYPE_UNION_T picture_data);
           
// открывает картинку  и получает её размер            
CANVAS_IMAGE_HANDLE_T UIS_CanvasOpenImageAndGetSize(UINT8 picture_type,
            PICTURE_TYPE_UNION_T picture_data,
            GRAPHIC_POINT_T *attributes);
// закрывает картинку            
UINT32 UIS_CanvasCloseImage(CANVAS_IMAGE_HANDLE_T image_handle);
         

// изменение размера
UINT32 UIS_CanvasResizeImage(CANVAS_IMAGE_HANDLE_T image_handle,
       UINT16 percent, // zoom в процентах
       GRAPHIC_REGION_T srcArea, // Исходный размер изображения
       GRAPHIC_REGION_T destRegion,// новый размер
       UINT8 drawOp,
       UIS_DIALOG_T handle);  
// возвращает размер изображения        
GRAPHIC_POINT_T UIS_CanvasGetImageSize(UINT8 picture_type,
           PICTURE_TYPE_UNION_T picture_data);

// устанавливает аттрибут
UINT32 UIS_CanvasSetImageAttribute(CANVAS_IMAGE_HANDLE_T image_handle,
                                   IMAGE_ATTRIBUTE_TYPE_T attribute_type,
              void* attribute_value);  
// получает аттрибут        
UINT32 UIS_CanvasGetImageAttribute(CANVAS_IMAGE_HANDLE_T image_handle,
                                   IMAGE_ATTRIBUTE_TYPE_T attribute_type,
              void* attribute_value);  

// преобразует картинку в буфер pointer
UINT32 UIS_CanvasDecodeImageToPointer(CANVAS_IMAGE_HANDLE_T image_handle, void* pointer);        
     
// вставляет буфер pointer    
UINT32 UIS_CanvasInsert(UIS_DIALOG_T handle,void* pointer, GRAPHIC_POINT_T point);

// перемещает регион
UINT32 UIS_CanvasMoveRegion(GRAPHIC_REGION_T source_region,
                           GRAPHIC_REGION_T dest_region,
                           UIS_DIALOG_T handle);    
     
/*******************************/

// задает цвет заливки
void UIS_CanvasSetFillColor(COLOR_T color);
// возвращает цвет заливки
COLOR_T UIS_CanvasGetFillColor(void);

// задает цвет для линий, прямоугольников, текста.....
void UIS_CanvasSetForegroundColor(COLOR_T color);
// возвращает цвет для линий, прямоугольников, текста.....
COLOR_T UIS_CanvasGetForegroundColor(void);

void UIS_CanvasSetBackgroundColor(COLOR_T color);
COLOR_T UIS_CanvasGetBackgroundColor(void);

// ширина линии
void UIS_CanvasSetLineWidth(UINT16 width);
UINT16 UIS_CanvasGetLineWidth(void);

/*******************************/

// обновление экрана
void UIS_CanvasRefreshDisplayRegion(UIS_DIALOG_T handle, GRAPHIC_REGION_T region);
void UIS_CanvasRefreshDisplayBuffer(UIS_DIALOG_T handle);

/*******************************/
     
//возвращает  возможную глубину цвета в битах
UINT32 UIS_CanvasGetColorDepth (void);

// возвращает размер дисплея
GRAPHIC_POINT_T UIS_CanvasGetDisplaySize(void);

трудность в том что мне надо сначало написать парсер строк(это пол беды) и ещё делить строки на несколько если она не влазит в одну строку на экране.
Ну и в завершении всего надо чтобы работал скрул, но я упростил для себя задачу: просто передается переменная Pos в которой указан номер строки которая должна быть нарисована в самом низу экрана(канвы)


 
DmT   (2008-05-29 09:19) [19]

Ну разделитель строк я написал:
function restring(str:Ansistring; width:integer):Ansistring;
var i,j:integer;
begin
 i:=0;j:=0;
 while (i<Length(str)) do begin
   j:=j+1;i:=i+1;
   if (j = width) then begin
   result:=result+#13#10;
   j:=1;
 end;
 if(str[i-1]=#10)then j:=1;
 result:=result+str[i];
end;

оталось только скрол написать


 
brother ©   (2008-05-29 10:34) [20]

скролл на канве? и как его прокручивать? клавиатурой? или мышей?)))
если клавой то ты близко к цели...
подскажу, отрисовывай текст не с начальных символов... мозг включен?


 
DmT   (2008-05-29 11:26) [21]

включен))
С клавиатуры естественно.
допустим по нажатию вниз/вверх, скролимся.
ну в общем виде надо так чтобы скролился до указаной строки.


 
DmT   (2008-05-29 21:49) [22]

Дак есть какие нибудь идеи по реализации моей простьбы?
Пожалуйста.



Страницы: 1 вся ветка

Текущий архив: 2008.06.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
15-1210753383
Vlad Oshin
2008-05-14 12:23
2008.06.22
настроить редактор для заготовок кода


2-1212066226
Sten
2008-05-29 17:03
2008.06.22
Вырезать в начале строки


2-1212056258
slimer
2008-05-29 14:17
2008.06.22
Результат TQRExpr


1-1195055685
NX
2007-11-14 18:54
2008.06.22
Обработка сообщений в сервисе


15-1210395742
Slider007
2008-05-10 09:02
2008.06.22
С днем рождения ! 10 мая 2008 суббота