Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.048 c
2-1211976882
Dmitrij
2008-05-28 16:14
2008.06.22
Дан список, состоящий из чисел.


9-1171442617
Vemer
2007-02-14 11:43
2008.06.22
Удаление объектов OpenGL


2-1212041689
Alex Ford
2008-05-29 10:14
2008.06.22
Вложение электронной почты


15-1210342314
NetZorro
2008-05-09 18:11
2008.06.22
про Combobox ?


2-1212024373
AlexAA
2008-05-29 05:26
2008.06.22
Работа с камерой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский