![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Столкнулась с интересной проблемой.
Есть форма с StringGrid, При нажатии ячейки я ввожу туда значения в виде (счет1) : (счет2). Делала я это с помощью TMaskEdit. И все работало: Код:
procedure TForm2.MaskEdit1Change(Sender: TObject); begin StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:=MaskEdit1.Text; end; procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin MaskEdit1.Visible := false; if (gdFocused in State) then begin if (ACol<>ARow) then begin MaskEdit1.Visible := true; MaskEdit1.Text:=StringGrid1.Cells[ACol, ARow]; MaskEdit1.Left := Rect.Left + StringGrid1.Left+2; MaskEdit1.Top := Rect.Top + StringGrid1.top+2; MaskEdit1.Width := Rect.Right - Rect.Left; MaskEdit1.Height := Rect.Bottom - Rect.Top; exit; end; end; end; Но для полной красоты мне не хватало указания времени когда проходила игра. Я решила добавить форму в которую записывались результаты и время. Добавила кнопку и прописала в ней событие открытия формы, но выкидывалась ошибка и я решила сначала сделать с помощью Message. С ним тоже проблем не возникло. Код:
procedure TForm2.StringGrid1Click(Sender: TObject); begin bt:=true; end; procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (bt=true) then //добавила, что бы срабатывало 1 раз после клика Begin if (gdFocused in State) then begin if (ACol<>ARow) then begin bt:=false; ShowMessage('llllll'); exit; end; end; end; end; А вот если заменить Message на вызов формы - возникают проблемы. Запустить форму как Form.ShowModal, не выходит, только как просто Form.Show. Форма запускается, но открывается на всю форму в которой прописан StringGrid и не поддается редактированию. Закрыть ее тоже не удается. Фактически программа виснет. Код:
procedure TForm2.btn3Click(Sender: TObject); begin bt:=True; if (not Assigned(Form4)) then Form4:=TForm4.Create(Self); Form4.Show; end; procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (bt=true) then Begin if (gdFocused in State) then begin if (ACol<>ARow) then begin bt:=false; btn3.Click; exit; end; end; end; end; Подскажите как это исправить ![]() По переживать и по сокрушаться - я всегда успею. Так что, дайте мне порадоваться в свое удовольствие! |
#2
|
|||
|
|||
![]() Попробуй так:
Код:
procedure TForm2.btn3Click(Sender: TObject); begin bt:=True; if (not Assigned(Form4)) then Application.CreateForm(TForm4, Form4);// <----- Form4.Show; end; <exit;> - лишнее Последний раз редактировалось icsander, 23.11.2012 в 18:22. |
#3
|
||||
|
||||
![]() Вообще никак не реагирует. Предлагает просто ввод в ячейку, форму не вызывает.
По переживать и по сокрушаться - я всегда успею. Так что, дайте мне порадоваться в свое удовольствие! |
#4
|
|||
|
|||
![]() Ну вообще вызов модальной формы в DrawCell не очень хорошая идея. Лучше перенести ее в StringGridDblClick либо в StringGridClick (не совсем удобно выделить ячейку или строку).
Код:
procedure TForm2.StringGridDblClick(Sender: TObject); begin Application.CreateForm(TForm4, Form4); Form4.Edit1.Text:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];//На Form4 есть Edit1, ему и передаем значение ячейки Form4.ShowModal; StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:=Form4.Edit1.Text;//Новый текст в ячейку Form4.Free;//Убиваем форму end; |
Этот пользователь сказал Спасибо icsander за это полезное сообщение: | ||
Edinora (23.11.2012)
|
#5
|
||||
|
||||
![]() Нет, все-таки реагирует, но так же как и в предыдущем случае.
По переживать и по сокрушаться - я всегда успею. Так что, дайте мне порадоваться в свое удовольствие! |
#6
|
|||
|
|||
![]() Подробнее опишите, что и как реагирует.
И если можно выложите весь проект (в архиве). |
#7
|
||||
|
||||
![]() ![]() Если пишу просто Form.show ошибка та же. ![]() По переживать и по сокрушаться - я всегда успею. Так что, дайте мне порадоваться в свое удовольствие! |
#8
|
|||
|
|||
![]() Ну так надо ShowModal. По Show форма сразу и закрывается, если смотреть по коду.
|
#9
|
||||
|
||||
![]() Все, разобралась. Спасибо большое за подсказки они очень помогли!!!
![]() я в последнем случае ошибку сделала, не в тот метод добавила. Кидаю рабочий код, вдруг кому-то еще надо будет ![]() _sg1 - StringGrid bt - проверка, что бы каждый раз при перерисовке форма не вызывалась Код:
var Form1: TForm1; bt:Boolean=false; implementation uses Unit2; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var num,d,i: Integer; begin num:=1; DoubleBuffered:=true; with Form1._sg1 do begin num:=15; if (num>0) then begin if (num>2)then begin RowCount:=num+1; ColCount:=num+1; end; d:= trunc((Width-20)/(num+1)); for i:=0 to num do begin Cells[0,i]:=IntToStr(i); Cells[i,0]:=IntToStr(i); ColWidths[i]:=d; end; end; end; end; procedure TForm1._sg1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var br:TBrush; acc,arr:Integer; begin if (ACol=ARow) then begin _sg1.Canvas.Brush.Color:=clRed; _sg1.Canvas.FillRect(Rect); end; if (bt = true) then begin if (gdFocused in State) then begin if (ACol<>ARow) then begin bt:=false; // ShowMessage('llllll'); end; end; end; end; procedure TForm1._sg1Click(Sender: TObject); begin bt:= True; Application.CreateForm(TForm2, Form2); Form2.Edt1.Text:=_sg1.Cells[_sg1.Col, _sg1.Row]; Form2.ShowModal; _sg1.Cells[_sg1.Col, _sg1.Row]:=Form2.Edt1.Text; Form2.Free; end; Огромадное СПАСИБО всем тем, кто помог в решении данного вопроса. По переживать и по сокрушаться - я всегда успею. Так что, дайте мне порадоваться в свое удовольствие! |
#10
|
|||
|
|||
![]() А с какого перепуга форма будет вызываться при перерисовке грида ???
|
#11
|
||||
|
||||
![]() Она будет вызываться 1 раз при клике на грид. Если не прописать условие bt, то форма будет вызываться при каждой перерисовке формы - отлично видно в примере message.
По переживать и по сокрушаться - я всегда успею. Так что, дайте мне порадоваться в свое удовольствие! |
#12
|
|||
|
|||
![]() Код
Код:
if (bt = true) then begin if (gdFocused in State) then begin if (ACol<>ARow) then begin bt:=false; // ShowMessage('llllll'); end; end; end; end; <bt> - не при делах. Форма вызывается только при клике на ячейке грида (procedure TForm1._sg1Click(Sender: TObject) ![]() ShowMessage('llllll'); - да, будет вызываться при перерисовке. |