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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2009, 21:19   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию работа с MEMO

Добрый вечер! разбирал программу, есть 2 однотипных вопроса. как сделать так, чотбы появились функции: void __fastcall TForm1::FormActivate(TObject *Sender) и void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)

Код:
---------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}

// Событие Activate происходит сразу после того,
// как окно появится на экране
void __fastcall TForm1::FormActivate(TObject *Sender)
{
  // загрузить в компонент Memo1 текст из файла
  try
  {
	  Memo1->Lines->LoadFromFile("kurs.txt");
  } catch (EFOpenError &e) {
	  ShowMessage(e.Message);
  }
}

// Щелчок на кнопке Закрыть (в заголовке окна) - НЕ ПОЛУЧИЛОСЬ. ФОРМА ПРОСТО ЗАКРЫЛАСЬ
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  // Если присвоить значение false переменной CanClose,
  // то окно не будет закрыто. По умолчанию значение
  // CanClose равно true.

  int r; // идентификатор кнопки, нажатой
		 // пользователем, в окне сообщения

  if (Memo1->Modified)
  {
	 // содержимое поля редактирования изменено
	 r = MessageDlg("Сохранить изменения?", mtWarning,
					TMsgDlgButtons() << mbYes << mbNo << mbCancel,0);

	 switch ( r )
	 {
	   case mrYes:  // записать текст в файл
					Memo1->Lines->SaveToFile("kurs.txt");
					break;
	   case mrCancel: // продолжить работу с программой
				 CanClose = false;
	 }
  }

}
Dimarik вне форума Ответить с цитированием
Старый 08.07.2009, 21:31   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

1. Выделить форму
2. Перейти на вкладку Events в Object Inspector (Это такая штука слева, где можно менять свойства)
3. Два раза кликнуть по пункту OnCloseQuery и OnActivate

ЗЫ. только при чем тут Memo?
psycho-coder вне форума Ответить с цитированием
Старый 09.07.2009, 15:50   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate (TObject *Sender)//как это получилось?
//я это вводил вручную
{
        try
        {
        Memo1->Lines->LoadFromFile("kurs.txt");
        }
        catch(EFOpenError &e)
        {
        ShowMessage(e.Message);
        }
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{            CanClose=false;

  // Если присвоить значение false переменной CanClose,
  // то окно не будет закрыто. По умолчанию значение
  // CanClose равно true.

  int r; // идентификатор кнопки, нажатой
		 // пользователем, в окне сообщения

  if (Memo1->Modified)
  {
	 // содержимое поля редактирования изменено
	 r = MessageDlg("Сохранить изменения?", mtWarning,
					TMsgDlgButtons() << mbYes << mbNo << mbCancel,0);

	 switch ( r )
	 {
	   case mrYes:  // записать текст в файл
					Memo1->Lines->SaveToFile("kurs.txt");
					break;
	   case mrCancel: // продолжить работу с программой
				 CanClose = false;
	 }
  }

}
выдало ошибку
[Linker Error] Unresolved external 'TForm1::' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\C+ + BUILDER\САМОУЧИТЕЛЬ\MEMO (СТР.95)\MEMO.OBJ
Dimarik вне форума Ответить с цитированием
Старый 09.07.2009, 22:49   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Даже не знаю что сказать.
В аттаче пример (я его слегка дополнил. Вы легко найдете разницу).
Внимательно его изучите
Вложения
Тип файла: rar new.rar (3.7 Кб, 11 просмотров)
psycho-coder вне форума Ответить с цитированием
Старый 11.07.2009, 21:48   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

В поле МЕМО данные представляются в виде массива строк. Но при работе с этим полем в виду специфичности создания программы мне необходимо получить доступ к каждому символу. Мне надо перегнать в массив символов? или как? Как мне получить доступ к каждому символу?
Dimarik вне форума Ответить с цитированием
Старый 12.07.2009, 00:10   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код:
Memo1->Text[1];
первый элемент будет 1.
Например в Memo есть текст "hello world".
то
Код:
Memo1->Text[1];
вернет букву "h".
psycho-coder вне форума Ответить с цитированием
Старый 12.07.2009, 11:01   #7
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int n;
        n=(Memo1->Text.Length());
        Memo2->Text=n;
        Memo2->Text=Memo1->Text;
        int i=n;
        AnsiString a,b;
        b=a;
        a[i-1]=a[i];//Когда использую в квадратных скобках переменную, возникает ошибка при выполнении
        a=Memo1->Text;
}
почему возникает ошибка при выполнении при переменной? а при числе этого нет?
мне необходимо использовать именно переменную
как избежать ошибки? использовать динамическое выделение памяти?

Последний раз редактировалось MaTBeu; 13.07.2009 в 19:38.
Dimarik вне форума Ответить с цитированием
Старый 12.07.2009, 12:22   #8
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int n;
n=(Memo1->Text.Length());
Memo2->Text=n;
Memo2->Text=Memo1->Text;
int i=n;
AnsiString a,b;
b=a;
a[i-1]=a[i];//Когда использую в квадратных скобках переменную, возникает ошибка при выполнении
a=Memo1->Text;



}
почему возникает ошибка при выполнении при переменной? а при числе этого нет?
мне необходимо использовать именно переменную
как избежать ошибки? использовать динамическое выделение памяти?
Еще бы она не возникала.
Вы в "пустоту" кладете "пустоту"
Код:
        AnsiString a,b;
        b=a;
А т.к. переменные не инициализированы, то и индексов нет, поэтому при обращении ошибка
Код:
 int n;
        n=(Memo1->Text.Length());
//        Memo2->Text=n; /* Это лишнее */
        Memo2->Text=Memo1->Text;
//        int i=n; /* Это тоже */
        AnsiString a,b;
//        b=a; /* что тут вы хотите сделать? */
        a=Memo1->Text;
        a[n-1]=a[n]; /* Зачем это? */
Лучше напишите свою задачу, что Вы хотите сделать, что бы знать в куда Вас направить.
psycho-coder вне форума Ответить с цитированием
Старый 12.07.2009, 12:27   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

поменять местами символы я хочу.
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int n;
        n=(Memo1->Text.Length());
        int i=n;
        char* a=(Memo1->Text).c_str();//êîïèðóåì äàííûå
        char* b=a;//êîïèðóåì äàííûå

                a[i]=a[i-1];

        Memo2->Text=a[i-1];

}
так работает, нопочему-то у char* i-ый символ другой, чем у AnsiString

подскажи, пожалуйста, почему iй символ у char* это (i+1)-ый символ у AnsiString. Это потому что у char* в конце ввода добавляется '\0', а у ансистринга его нет??
и как написать то, что я хочу, чтобы менялись символы местами без использования указателей. через ансистринг?

Последний раз редактировалось Sazary; 13.07.2009 в 14:29.
Dimarik вне форума Ответить с цитированием
Старый 12.07.2009, 12:52   #10
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
так работает, нопочему-то у char* i-ый символ другой, чем у AnsiString
потому что счет начингаеться с нуля, в классе AnsiString начинаеться с 1, незнаю почему в биледере хотели отличиться... кхм

Код:
int n;
n=(Memo1->Text.Length());
Memo2->Text=n;
Memo2->Text=Memo1->Text;
int i=n;
AnsiString a,b; //Классы объявлены но не инициализированы в памяти
b=a;
a[i-1]=a[i]; //Поэтому здесь ошибка, ведь данного элемента в памяти не существует
a=Memo1->Text;
lennon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с Memo RockForr Компоненты Delphi 2 28.04.2009 19:56
Работа с Memo Волк Общие вопросы Delphi 3 13.02.2009 17:47
Компонент Memo и работа с *.ini-файлами nerZEROn Общие вопросы Delphi 11 08.01.2009 16:31
Примерный алгоритм программы и работа с Memo Freestyler Помощь студентам 0 10.12.2008 22:46
работа со строками в Memo ddtpoison Компоненты Delphi 3 01.06.2008 18:33