fORM
Подскажите, не было ли у кого похожего случая -
1) есть Form1, из которой динамически создается Form2 кликом на Cheke(соответственно Checked = true создает, Checked = false уничтожает). Однако form2 - Dialog, которую пользователь может закрыть еще и нажав border icon. Можно ли сделать так, что закрывая ее таким образом, в Form1 было Check1->Checked = false?
2) Загрузка bmp возможна в том числе и через LoadFromResurseName/ID. Ресурс имеется в виду .res? У Архангельского красноречиво написано, что первое - "загрузка файла из ресурса по имени", а второе - "по идентификатору". Однако, попробовав вариант мз справки, ничего не получилось. Ведь если таких картинок несколько десятков, и они должны храниться в одной директории с .exe лучше бы их засунуть в один файл...
Господа!
Подскажите, не было ли у кого похожего случая -
1) есть Form1, из которой динамически создается Form2 кликом на Cheke(соответственно Checked = true создает, Checked = false уничтожает). Однако form2 - Dialog, которую пользователь может закрыть еще и нажав border icon. Можно ли сделать так, что закрывая ее таким образом, в Form1 было Check1->Checked = false?
Сделяй в обработчике onClose Form2
Form1->Checked=false;
2) Загрузка bmp возможна в том числе и через LoadFromResurseName/ID. Ресурс имеется в виду .res? У Архангельского красноречиво написано, что первое - "загрузка файла из ресурса по имени", а второе - "по идентификатору". Однако, попробовав вариант мз справки, ничего не получилось. Ведь если таких картинок несколько десятков, и они должны храниться в одной директории с .exe лучше бы их засунуть в один файл...
Они должны быть в экзешнике, который пытается их загрузить.
Они должны быть в экзешнике, который пытается их загрузить.
Спасибо! Однако, почему, когда я удаляю bmp из одноименной директории, в момент загрузки он мне пишет messageBox "Не возможно загрузить файл *.bmp"? И после ОК делаеь пустую рамку?
Спасибо! Однако, почему, когда я удаляю bmp из одноименной директории, в момент загрузки он мне пишет messageBox "Не возможно загрузить файл *.bmp"? И после ОК делаеь пустую рамку?
А ты их динамически грузишь или в процессе проектирования?
А ты их динамически грузишь или в процессе проектирования?
после динамического создания новой формы -
Image1->Picture->Bitmap->LoadFromFile("*.bmp");
Кстати, а как сделать внутри какой-то процедуры, например, Buttom-click, после операторов
if(........)
{
if(........)
{
........
}
}
повторное нажатие Button1?
То есть, если быди выполнены все операторы if и нажата Button1? Я пробовал дальше писать
if(Button1->OnClick())
, но..... лажа
после динамического создания новой формы -
Image1->Picture->Bitmap->LoadFromFile("*.bmp");
Поэтому и матерится. Ты пытаешься загрузить внешний файл, а ты его уже удалил.
Кстати, а как сделать внутри какой-то процедуры, например, Buttom-click, после операторов
if(........)
{
if(........)
{
........
}
}
повторное нажатие Button1?
То есть, если быди выполнены все операторы if и нажата Button1? Я пробовал дальше писать
if(Button1->OnClick())
, но..... лажа
Button1->Click();
Поэтому и матерится. Ты пытаешься загрузить внешний файл, а ты его уже удалил.
Да, так вот я потому и спрашивал - если таких .bmp несколько десятков, есть ли способ их запихнуть в какой-то один ресурс? Или хотя бы во внутреннюю папку?
Да, так вот я потому и спрашивал - если таких .bmp несколько десятков, есть ли способ их запихнуть в какой-то один ресурс? Или хотя бы во внутреннюю папку?
Их можно загрузить например в ImageList, правда тогда они будут внутри EXE'шника. А во внутреннюю подпапку их запихнуть проблем я думаю не составит.
Про Button1->Click();
если вот здесь -
void __fastcall TForm2::Button1Click(TObject *Sender)
{
if(Form1->Speed1->Down)
{
if(Form1->RadioGr->ItemIndex == 0)
{
if(Form1->Radio1->ItemIndex == 0)
{
if(RadioCh1->ItemIndex == -1)
{Application->MessageBox("Выберите одно из трех значений!",
"MB - выбор значения", MB_ICONWARNING);}
if(RadioCh1->ItemIndex == 0)
{Label1->Caption = “…";
Image1->Picture->Bitmap->LoadFromFile("Sh+.bmp.");
RadioCh1->Visible = false;}
if(RadioCh1->ItemIndex == 1 || RadioCh1->ItemIndex == 2)
{Label1->Caption = "…";
Image1->Picture->Bitmap->LoadFromFile("Sh-.bmp.");
RadioCh1->Visible = false;}
Button1->Click();
}
}
}
}
выставить как ты написал, то все просто зависнет, может ты имел в виду что-то другое?
2)
для динамически создаваемой формы? Я пробовал - если их нет в одной директории в exe, то он "матерится", варианты есть?
А ты к картинкам путь правильно пишешь???
А ты к картинкам путь правильно пишешь???
А какой путь? такой?
Image1->Picture->Bitmap->LoadFromFile(.../pictures/"*.bmp");
я так написал, а он мне - нельзя найти файл Pictures*.bmp!
2)Скажи еще такую вещь - объявляю я int-переменные в динамически-создаваемой форме (вверху, после TForm *TForm). Когда форма унижтожается методом Close(); все значения этих переменных сохраняются, и когда запускаешь эту форму заново, значения их прибавляются к предыдущим. Если же их объявить внутри процедуры void __fastcall TForm2::Button1Click(TObject *Sender)
{
int a;
int b;
int c;
if(Form1->Speed1->Down)
{
if(Form1->RadioGr->ItemIndex == 0)
{
if(Form1->Radio1->ItemIndex == 0)
{
if(RadioCh1->ItemIndex == -1)
{Application->MessageBox("Выберите одно из трех значений!",
"MB - выбор значения", MB_ICONWARNING);}
if(RadioCh1->ItemIndex == 0)
{Label1->Caption = “…";
Image1->Picture->Bitmap->LoadFromFile("Sh+.bmp.");
RadioCh1->Visible = false;
a++;
b++;
Form1->Edit1->Caption = IntToStr(a);
Form1->Edit2->Caption = IntToStr(b);}
if(RadioCh1->ItemIndex == 1 || RadioCh1->ItemIndex == 2)
{Label1->Caption = "…";
Image1->Picture->Bitmap->LoadFromFile("Sh-.bmp.");
RadioCh1->Visible = false;
a++;
c++;
Form1->Edit1->Caption = IntToStr(a);
Form1->Edit2->Caption = IntToStr(c);}
}
}
}
}
}
, то области действия не хватает на другие подциклы if()(?) А надо, чтобы все значения обнулировались.
Коненчно понимаю, что вопроса простой, но...
А у тебя есть файл с названием *.bmp ???
Попробуй так:
Image1->Picture->Bitmap->LoadFromFile("путь к файлу"+zzz.bmp);
Для начала, после того как закрываешь форму, освобождай выделенную память. Тогда ничего остаться не должно.
А у тебя есть файл с названием *.bmp ???
Попробуй так:
Image1->Picture->Bitmap->LoadFromFile("путь к файлу"+zzz.bmp);
Да-да, уже пробовал!
Кажется , никакого пути кроме простого LOadFrom нет. Смотрел я Архангельского - при уничтожении формы можно прописывать в OnClose() Action = caFree; , тогда освобождается память, также можно писать delete Form2;, однако все это не работает!
Причем очень странно!
Что значит вот это сообщение -
Project raised exception class EAccessViolation with message “Access Violation at address 400EE72E in module VCL60.BPL”. Read of address “FFFFFFFF”. Process stopped. Use Step or Run to continue. ?
В справке я смотрел - написано, что либо exeption lanquage либо exeption OS! Это может быть связано с тем, что язык интерфейса русский? И чаво тогда делать? Это сообщение возникает, когда во вновь созданной динамической форме кликаешь на кнопки.
эТо может быть связанго с памятью?
Да-да, уже пробовал!
Кажется , никакого пути кроме простого LOadFrom нет. Смотрел я Архангельского - при уничтожении формы можно прописывать в OnClose() Action = caFree; , тогда освобождается память, также можно писать delete Form2;, однако все это не работает!
Причем очень странно!
Что значит вот это сообщение -
Project raised exception class EAccessViolation with message “Access Violation at address 400EE72E in module VCL60.BPL”. Read of address “FFFFFFFF”. Process stopped. Use Step or Run to continue. ?
В справке я смотрел - написано, что либо exeption lanquage либо exeption OS! Это может быть связано с тем, что язык интерфейса русский? И чаво тогда делать? Это сообщение возникает, когда во вновь созданной динамической форме кликаешь на кнопки.
эТо может быть связанго с памятью?
Странно, напиши, код которым ты создаёшь форму и её уничтожаешь. И ещё, ты кнопки динамически создаёшь??? Это происходит только при кликах на кнопках или ещё когда??? Язык интерфейса тут не причём.
Странно, напиши, код которым ты создаёшь форму и её уничтожаешь. И ещё, ты кнопки динамически создаёшь??? Это происходит только при кликах на кнопках или ещё когда??? Язык интерфейса тут не причём.
Ну вот код buttona главной формы, которая создает вторую форму:
void __fastcall TForm1::StartClick(TObject *Sender)
{
if(Form1->Speed1->Down == true)
{
if(Radio1->ItemIndex == 0)
{
if(Level->ItemIndex == 0)
{Application->CreateForm(__classid(TFormKQ), &FormKQ); //создание новой формы FormKeyQuestion - здесь должны быть вопросы, отвечая на которые и нажав кнопку Button1 создается третья форма - FormKeyAnswer, которая показывает, правильный ли ответ
FormKQ->Visible = true;
FormKQ->Image1->Picture->LoadFromFile("Sh.bmp");
FormKQ->Caption = "Первый вопрос";
//это счетчик ответов, на нем держится все взаимодействие двух динамических форм, именно в трех переменных ALL, R, L сохраняется значение, которое не очищается при закрытии форм
Form1->Static1->Caption = 0; //всего int All
Form1->Static2->Caption = 0; //правильных int R
Form1->Static3->Caption = 0; //неправильных int L
}
}
}
}
Это код клавиши, закрывающей вторую форму, то есть "Вернуться в главную форму"
void __fastcall TFormKQ::Button2Click(TObject *Sender)
{
FormKQ->Close();
Form1->Static1->Caption = "";
Form1->Static2->Caption = "";
Form1->Static3->Caption = "";
}
Это аналогичный код закрытия второй формы через system icon
void __fastcall TFormKQ::FormClose(TObject *Sender, TCloseAction &Action)
{
//хотел здесь написать как вверху FormKQ->Close(); , но он мне матернулся
Form1->Static1->Caption = "";
Form1->Static2->Caption = "";
Form1->Static3->Caption = "";
}
Этот код для возвращения второй формы, так как она существует в памяти, но просто Visible = false, потом =true, так они появляются поочередно - вопрос - ответ, отсюда загружаются новые вопросы
void __fastcall TFormKQ::FormShow(TObject *Sender)
{
if(Form1->Speed1->Down == true)
{
if(Form1->Radio1->ItemIndex == 0)
{
if(Form1->Level->ItemIndex == 0)
{
if(Form1->Static1->Caption == 1)
{FormKQ->Panel1->Color = clSkyBlue;
FormKQ->RadioGr->ItemIndex = -1;
FormKQ->Image1->Picture->LoadFromFile("B.bmp");
FormKQ->Caption = "Второй вопрос";}
if(Form1->Static1->Caption == 2)
{FormKQ->Panel1->Color = clSkyBlue;
FormKQ->RadioGr->ItemIndex = -1;
FormKQ->Image1->Picture->LoadFromFile("N.bmp");
FormKQ->Caption = "Третий вопрос";}
}
}
}
}
Создание второй динам. формы
//------------------------------------------------
int All = 0;
int R = 0;
int L = 0;
void __fastcall TFormKQ::Button1Click(TObject *Sender)
{
if(Form1->Speed1->Down == true)
{
if(Form1->Radio1->ItemIndex == 0)
{
if(Form1->Level->ItemIndex == 0)
{
if(Form1->Static1->Caption == 0)
{
if(FormKQ->RadioGr->ItemIndex == 0)
{Application->CreateForm(__classid(TFormKA), &FormKA);
FormKA->Visible = true; //Это кнопка, которая создает вторую динамическую форму FormKeyAnswer
FormKQ->Visible = false; //а первую динамическую скрывает, идея в том, чтобы при вопросе-ответе они были созданы, но только одна видна, а при возвращении в главную форму через Button2 и там и там они унижтожались, и при запуске заново переменные отсчитывали бы все по-новому
FormKA->Image1->Picture->LoadFromFile("Sh+.bmp");
FormKA->Label2->Caption = "Это ДИЕЗ";
FormKA->Caption = "Правильный ответ на первый вопрос";
All = All++;
R = R++;
L = L;
Form1->Static1->Caption = IntToStr(All);
Form1->Static2->Caption = IntToStr(R);
Form1->Static3->Caption = IntToStr(L);}
if(FormKQ->RadioGr->ItemIndex == 1 || FormKQ->RadioGr->ItemIndex == 2)//здесь его тормозит но том сообщении
{FormKA->Visible = true;
FormKQ->Visible = false;
FormKA->Label1->Caption = "Неправильно!";
FormKA->Caption = "Неправильный ответ на первый вопрос";
FormKA->Label2->Caption = "Это ДИЕЗ";
FormKA->Image1->Picture->LoadFromFile("Sh-.bmp");
All = All++;
R = R;
L = L++;
Form1->Static1->Caption = IntToStr(All);
Form1->Static2->Caption = IntToStr(R);
Form1->Static3->Caption = IntToStr(L);}
if(FormKQ->RadioGr->ItemIndex == -1)
{ShowMessage("Выберите одно из трех значений.");} }
if(Form1->Static1->Caption == 1)
{
if(FormKQ->Visible == true) // это тоже такая бяка - без этого условия ничего не работало, только, когда форма видна, что-то происходит, отсюда обмен с void __fastcall TFormKQ::FormShow(TObject *Sender)
{
if(FormKQ->RadioGr->ItemIndex == 1)
{FormKA->Visible = true;
FormKQ->Visible = false;
FormKA->Image1->Picture->LoadFromFile("B+.bmp");
FormKA->Label2->Caption = "Это БЕМОЛЬ.";
FormKA->Label1->Caption = "Совершенно правильно!";
FormKA->Caption = "Правильный ответ на второй вопрос";
All = All++;
R = R++;
L = L;
Form1->Static1->Caption = IntToStr(All);
Form1->Static2->Caption = IntToStr(R);
Form1->Static3->Caption = IntToStr(L);}
if(FormKQ->RadioGr->ItemIndex == -1)
{ShowMessage("Выберите одно из трех значений.");}
if(FormKQ->RadioGr->ItemIndex == 0 || FormKQ->RadioGr->ItemIndex == 2)
{FormKA->Visible = true;
FormKQ->Visible = false;
FormKA->Label1->Caption = "Неправильно!";
FormKA->Caption = "Неправильный ответ на второй вопрос";
FormKA->Label2->Caption = "Это БЕМОЛЬ.";
FormKA->Image1->Picture->LoadFromFile("B-.bmp");
All = All++;
R = R;
L = L++;
Form1->Static1->Caption = IntToStr(All);
Form1->Static2->Caption = IntToStr(R);
Form1->Static3->Caption = IntToStr(L);} }
}
}
}
}
}
как можно догадаться, все .bmp здесб - рисунки с изображением диеза, бемоля или бекара
Это соответственно button на третьей форме, которая должна закрывать и себя и вторую формы
void __fastcall TFormKA::Button2Click(TObject *Sender)
{
FormKA->Close();
FormKQ->Close();
}
В общем здесь нет всех этих Action = caFree - я из выкинул, потому как ничего не добавляют...?
И еще "delete Form-такая-то" - можно ли это делать из самой формы?
Динамически кнопки не создавал - это надо для каждой кнопки прописать код типа CreateButton?
Ну люди!! Помогите кто-нибудь! А то тут шестнадцатеричные регистры уже новичков мочат!!!!