Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Memo->Array


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

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

Автор: anwe 5.12.2006, 22:34
Читай строки из memo с проверкой на конец строки. Встретил такой символ -> запиши в первый элемент массива. Массив лучше держать динамический.

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

Автор: anwe 6.12.2006, 08:16
Если тебе надо после обрезать - то считай символы и кол-во строк и урезай до необходимого. Если динамически - то, навреное, делай субклассинг или просто подсчитывай кол-во символом по KeyDown/KeyUp.

Автор: Reptile 6.12.2006, 11:46
Простой, но не самый лучший способ smile 
Зделай ширину Memo 289 так в строку вмещается 40 символов, установи MaxLength =  160,а шрифт Courier New(для того чтобы разные символы занимали одинаково места).

Автор: Vyacheslav 6.12.2006, 16:33
Переход на другую строку при превышении заданного предела решает просто решает просто
Код

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;

}



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

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


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

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

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

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

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

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

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


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

Автор: codelord 9.12.2006, 12:27
а если так:
Код

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

Автор: codelord 10.12.2006, 16:14
вот попробуй такой вариант, наверно нужны доработки тем не менее вроде работет.
думаю ты в курсе  в конце каждой строки есть сиволы переноса (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;
}
//-----------------------------------------------------------------------

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)