Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Memo->Array, Но не переписать а как-бы превратить 
:(
    Опции темы
megabist
Дата 5.12.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Mart Slaaf
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 3.4.2006
Где: Мск

Репутация: нет
Всего: 31



Итак суть проблемы в том, что мне ужно чтобы пользоваетль мог ввести скажем 4 строки по 40 символов максимум...
тоесть должен получиться массив 
MaxLenght устанавливает общую длину....

создавшаяся конструция должна быть жёсткой... тоесть заменить пожалуйста но никаких дописываний и.т.д



--------------------
Don't panic!

Жди, и Фатум тебя приведёт...
PM MAIL ICQ Skype GTalk   Вверх
anwe
Дата 5.12.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Читай строки из memo с проверкой на конец строки. Встретил такой символ -> запиши в первый элемент массива. Массив лучше держать динамический.
PM MAIL   Вверх
megabist
Дата 6.12.2006, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Mart Slaaf
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 3.4.2006
Где: Мск

Репутация: нет
Всего: 31



Гммм либо я вас не совсем понял, либо немного не то.... 
Мне-то нужно ограничение прямо в Мемо.... не потом когда-нибудь, а чтобы  мемо не вводилось больше знако прямоугольника 4*40...
К тому же для того, что вы написали, вроде достатточно считать из Memo в AnsiString а потом перевести в char....

Это сообщение отредактировал(а) megabist - 6.12.2006, 08:05


--------------------
Don't panic!

Жди, и Фатум тебя приведёт...
PM MAIL ICQ Skype GTalk   Вверх
anwe
Дата 6.12.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Если тебе надо после обрезать - то считай символы и кол-во строк и урезай до необходимого. Если динамически - то, навреное, делай субклассинг или просто подсчитывай кол-во символом по KeyDown/KeyUp.
PM MAIL   Вверх
Reptile
Дата 6.12.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Простой, но не самый лучший способ smile 
Зделай ширину Memo 289 так в строку вмещается 40 символов, установи MaxLength =  160,а шрифт Courier New(для того чтобы разные символы занимали одинаково места).
PM MAIL   Вверх
Vyacheslav
Дата 6.12.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Переход на другую строку при превышении заданного предела решает просто решает просто
Код

void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
    if( Memo1->SelStart < 40)
    {
        Key = VK_RETURN;
        Beep();
    }
}

Отстается решить вопрос с обрезкой строк при вставке символа в уже запоненную строку
Решать это дело перебором всех строк не очень красиво, хотя ... smile
Хотя конечно можно решить и без KeyPress все кардинально 
Ограничиваем общую длину в 160 символов
Инициализируем мемо четырьмя пустыми строчками и задаем обработчк OnChange 
Код

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
      for(int i= 0; i < 4; i++)     {
        Memo1->Lines->Add("");
    }
}

void __fastcall TForm1::Memo1Change(TObject *Sender)
{
    Memo1->OnChange = NULL;
    for(int i = 0; i <  Memo1->Lines->Count; i++)
    {
       if(Memo1->Lines->Strings[i].Length() > 40 && i < (Memo1->Lines->Count - 1) )
       {
        String  fragment = Memo1->Lines->Strings[i].SubString(41, Memo1->Lines->Strings[i].Length() - 40 );
        Memo1->Lines->Strings[i] = Memo1->Lines->Strings[i].SubString(1, 40);
        Memo1->Lines->Strings[i + 1] = fragment +   Memo1->Lines->Strings[i + 1];
       }

    }
    Memo1->OnChange =  Memo1Change;

}





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
megabist
Дата 6.12.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Mart Slaaf
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 3.4.2006
Где: Мск

Репутация: нет
Всего: 31



Вячеслав, спасибо за помошь, но первый код работает только на первой строке...
Или первые строки без вторых и не должны работать?
P.S.  Знак > поправил=). Это не каменьь в чью-то сторону, а просто факт, что не из-а этого


--------------------
Don't panic!

Жди, и Фатум тебя приведёт...
PM MAIL ICQ Skype GTalk   Вверх
Vyacheslav
Дата 7.12.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Реально и нормально работает вторая версия Memo1Change.  
Memo1KeyPress - это просто размышление вслух.




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
megabist
Дата 7.12.2006, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Mart Slaaf
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 3.4.2006
Где: Мск

Репутация: нет
Всего: 31



Простите не работает всё равно
первую строчку нормуль отрабатывает...
вторую ставит 1 букву... и дальше при попытке ввести кидает на сл строку!!!
помогите разобраться с тремя средними строчками кода... может я тогда пойму...


--------------------
Don't panic!

Жди, и Фатум тебя приведёт...
PM MAIL ICQ Skype GTalk   Вверх
Vyacheslav
Дата 8.12.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(megabist @  7.12.2006,  21:23 Найти цитируемый пост)
Простите не работает всё равно
первую строчку нормуль отрабатывает...

Уважаемый. Я же по русски написал

Цитата(Vyacheslav @  7.12.2006,  10:46 Найти цитируемый пост)
Реально и нормально работает вторая версия Memo1Change.  
Memo1KeyPress - это просто размышление вслух.

А Вы похоже используете и то и другое вместе 
Нужен только Memo1Change и добавление 4 строк в конструкторе



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
megabist
Дата 8.12.2006, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Mart Slaaf
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 3.4.2006
Где: Мск

Репутация: нет
Всего: 31



Нет всё равно работает очень странно...
Всё бы ничего но при разного рода переносах перескоках и переудалениях он выкидывает середину, меняя весмь смысл сказанного
вот например кусок текста проверено вводился правильно, вводился длинной строкой потом из конца кусок проскочил в начало строки...:
Цитата

мама мыла раму, саша с Машей пошли погул
ебланять по ночному кладбищу а что 


простите за тослово что вклинилось в погулять


--------------------
Don't panic!

Жди, и Фатум тебя приведёт...
PM MAIL ICQ Skype GTalk   Вверх
codelord
Дата 9.12.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



а если так:
Код

void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
    if( Memo1->CaretPos.x>40)
    {
        Key = VK_RETURN;
    }
}



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
codelord
Дата 10.12.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



вот попробуй такой вариант, наверно нужны доработки тем не менее вроде работет.
думаю ты в курсе  в конце каждой строки есть сиволы переноса (0x0D, 0x0A) поэтому когда ты будешь работать с полученным массивом должен это учитывать. т.е. сохраненный файл будет весить 166 байт., конечно можно убрать эти байты уменьшением размера формы и wordwrap но там как тебе удобнее.
Код

__fastcall TForm1::TForm1(TComponent* Owner)//в конструктор
        : TForm(Owner)
{
        for(int i= 0; i < 3; i++)
        Memo1->Lines->Add("");
        TPoint caret;
        caret.x=0; caret.y=0;
        Memo1->CaretPos=caret;
}

void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
if(Key==VK_RETURN )Key=0x0;
TPoint point;
point = Memo1->CaretPos;
if( Memo1->CaretPos.x>40)
    {
       point.x=0;
       point.y+=1;
    }
Memo1->CaretPos=point;
}
//--------------------------------------
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
TPoint point;
point = Memo1->CaretPos;
AnsiString line = Memo1->Lines->Strings[Memo1->CaretPos.y];
 if(line.Length() >40)
        {
        line=line.SubString(1,40); //Из за этого символ введенный последним съедается, 
        Memo1->Lines->Strings[Memo1->CaretPos.y]=line;
        }

if(Memo1->Lines->Count>4){
         TStringList *list = new TStringList;
         for(int i=0;i<4;i++)list->Add(Memo1->Lines->Strings[i]);
         Memo1->Clear();
         Memo1->Text=list->Text;
         delete(list);
        }
if(point.y>3){point.y=3; point.x=40;}
Memo1->CaretPos=point;
}
//-----------------------------------------------------------------------



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
megabist
Дата 10.12.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Mart Slaaf
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 3.4.2006
Где: Мск

Репутация: нет
Всего: 31



Да, то что доктор прописал....
Спасибо... и всем за помощь
сказал не видя второго, так как работало и первое... вродекак
тоесть без ошибок.

Это сообщение отредактировал(а) megabist - 10.12.2006, 20:41


--------------------
Don't panic!

Жди, и Фатум тебя приведёт...
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.