Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с "я"


vasIZmax ©   (2007-07-20 03:05:00) 

Столкнулся с такой проблемкой: буква "я" не выводится в caption.
Дело в том что после работы с программой данные записываются в ini-файл. Потом при запуске данные считываются из этого файла и записываются по различным Edit'am, Panel and Button, и тут возникает указанная проблемка (предположим считывается слово "статья"): в edit - слово "статья" нормально записывается, потом на каждый символ создается панель, и в свойство caption выводится по одному символу, и панель где должна быть буква "я" - пустая.

В чем может быть проблема?


Stanislav   (2007-07-20 12:22:00) [1]

Главное чтобы проблем с собственным "Я" небыло :-)


vasIZmax   (2007-07-20 11:46:00) [2]


> Ivolg ©   (20.07.07 11:43) [16]

Имхо,

>  if (S2 = 'я') or (S2='Я')then

подчеркнутое лишнее. проверять надо только на маленькую "я", с большой все в порядке. Но о copy/delete даже не подумал, спс))


Ivolg   (2007-07-20 11:43:00) [3]

Немного доработал:

var
  S, S2: String;
  I: Integer;
  Wer: TPanel;
begin
    S := Edit1.Text;
    for I := 0 to Length(Edit1.Text) - 1 do
     begin
       S2 := Copy(S, 1, 1);
       Delete(S, 1, 1);
       Wer := TPanel.Create(Form1);
       Wer.Top := Random(350) + 60;
       Wer.Left := Random(350) + 60;
       Wer.Name := 'but' + Inttostr(I);
       if (S2 = 'я') or (S2='Я') then
         Wer.Caption := ' '+S2
       else
       Wer.Caption := S2;
       Wer.Font.Size :=16;
       Wer.Parent := Form1;
     end;
end;


Игорь Шевченко   (2007-07-20 11:36:00) [4]


> Если мне не изменяет память, это проблема конкретной версии
> Дельфи (кстати, твоя не указана).


Это проблема Windows
http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=628


Ivolg   (2007-07-20 11:13:00) [5]

Можно так:

var
  S, S2: String;
  I: Integer;
  Wer: TPanel;
begin
    S := Edit1.Text;
    for I := 0 to Length(Edit1.Text) - 1 do
     begin
       S2 := Copy(S, 1, 1);
       Delete(S, 1, 1);
       Wer := TPanel.Create(Form1);
       Wer.Top := Random(350) + 60;
       Wer.Left := Random(350) + 60;
       Wer.Name := 'but' + Inttostr(I);
       Wer.Caption := S2;
       Wer.Font.Size :=16;
       Wer.Parent := Form1;
     end;
end;


vasIZmax   (2007-07-20 11:01:00) [6]


> Desdechado ©   (20.07.07 10:45) [12]

Сорри, версия 7.
В данном случае да - пробел решает проблему.

А вот код (сразу скажу что не мой, взято у Краснова из примеров к книге по OpenGL) - так в нем не решается эта проблема пробелом (так и быть сейчас спрошу, все-равно через недельку-другую спросил бы)

unit frmMain;

interface

uses
Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus,
Controls, Dialogs, SysUtils,
OpenGL;

type
 TfrmGL = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);

 private
   DC : HDC;
   hrc : HGLRC;

   procedure InitializeRC;
   procedure SetDCPixelFormat;
 end;

const
 GLF_START_LIST = 1000;

var
 frmGL: TfrmGL;

implementation

{$R *.DFM}

{=======================================================================
Вывод текста}
procedure OutText (Litera : PChar);
begin
 glListBase(GLF_START_LIST);
 glCallLists(Length (Litera), GL_UNSIGNED_BYTE, Litera);
end;

{=======================================================================
Процедура инициализации источника цвета}
procedure TfrmGL.InitializeRC;
begin
 glEnable(GL_DEPTH_TEST);// разрешаем тест глубины
 glEnable(GL_LIGHTING);  // разрешаем работу с освещенностью
 glEnable(GL_LIGHT0);    // включаем источник света 0
end;

{=======================================================================
Рисование картинки}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
// вывод текста
OutText ('Проба');
SwapBuffers(DC);
end;

{=======================================================================
Установка формата пикселей}
procedure TfrmGL.SetDCPixelFormat;
var
 nPixelFormat: Integer;
 pfd: TPixelFormatDescriptor;
begin
 FillChar(pfd, SizeOf(pfd), 0);

 With pfd do begin
   dwFlags   := PFD_DRAW_TO_WINDOW or
                PFD_SUPPORT_OPENGL or
                PFD_DOUBLEBUFFER;
   cDepthBits:= 32;
 end;

 nPixelFormat := ChoosePixelFormat(DC, @pfd);
 SetPixelFormat(DC, nPixelFormat, @pfd);
end;

{=======================================================================
Создание окна}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
 DC := GetDC(Handle);
 SetDCPixelFormat;
 hrc := wglCreateContext(DC);
 wglMakeCurrent(DC, hrc);
 glClearColor (0.3, 0.4, 0.6, 1.0);
 wglUseFontOutlines (Canvas.Handle, 0, 255, GLF_START_LIST, 50, 0.15,
                     WGL_FONT_POLYGONS, nil);
 InitializeRC;
end;

{=======================================================================
Изменение размеров окна}
procedure TfrmGL.FormResize(Sender: TObject);
begin
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity;
 gluPerspective(15.0, ClientWidth / ClientHeight, 1.0, 20.0);
 glViewport(0, 0, ClientWidth, ClientHeight);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity;
 glTranslatef(-0.8, -0.7, -9.0);
 glRotatef(30.0, 1.0, 1.0, 0.0);
 glRotatef(30.0, 0.0, 1.0, 0.0);
 InvalidateRect(Handle, nil, False);
end;

procedure TfrmGL.FormDestroy(Sender: TObject);
begin
 glDeleteLists (GLF_START_LIST, 256);
 wglMakeCurrent(0, 0);
 wglDeleteContext(hrc);
 ReleaseDC(Handle, DC);
 DeleteDC(DC);
end;

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 If Key = VK_ESCAPE then Close
end;

end.


вот здесь пробел не помогает((

ЗЫ. вот уж это "я"(((


Desdechado   (2007-07-20 10:45:00) [7]

Если мне не изменяет память, это проблема конкретной версии Дельфи (кстати, твоя не указана).
И пробел в строке должен решать проблему.


vasIZmax   (2007-07-20 08:17:00) [8]


> Anatoly Podgoretsky ©   (20.07.07 07:45) [10]

И как такие проблемы обходить?


Anatoly Podgoretsky   (2007-07-20 07:45:00) [9]

> vasIZmax  (20.07.2007 07:37:09)  [9]

Потому что у нее код $FF


vasIZmax   (2007-07-20 07:37:00) [10]


> ASoft   (20.07.07 07:32) [8]

Хм... странный ход, но главное - рабочий. И меня устроит. Спс.

ЗЫ. А вот почему без пробела не желает появляться буква, вот это интересно)))


ASoft   (2007-07-20 07:32:00) [11]

поставь пробел перед s[t]: wer.Caption:=' '+s[t];
если тебя это устроит


ASoft   (2007-07-20 07:18:00) [12]

Я - появляется, я - нет:-)


vasIZmax   (2007-07-20 06:46:00) [13]


> ASoft   (20.07.07 06:40) [5]

Результат = 0...
Даже если так:
ini.WriteString('Edit_Text', 'edit1', 'Прояяяяявка');
ни одной не появляется буквы "я"


ASoft   (2007-07-20 06:40:00) [14]


> А если будет не "статья", а "проявка"?:-)

а ты проверь


vasIZmax   (2007-07-20 06:25:00) [15]


> ASoft   (20.07.07 06:21) [3]


А если будет не "статья", а "проявка"?:-)

здесь в чем-то другом проблема((


ASoft   (2007-07-20 06:21:00) [16]

Попробуй так:

procedure tform1.CreateBut;
Var
wer: TPanel;
s:string;
t:integer;
Begin
t:=1;
s:=edit1.Text;
 While t<=length(edit1.Text) do
  begin
   wer:=TPanel.Create(form1);
   wer.Top:= random(350)+60;
   wer.Left:=random(350)+60;
   wer.Name:='but'+inttostr(t);
   wer.Caption:=s[t];
   wer.Font.Size:=16;
   wer.Parent:=form1;
   inc(t);
  end;
end;

в твоем коде, при достижении t=6 сразу происходит выход их цикла и 6 буква не обрабатывается


vasIZmax   (2007-07-20 05:17:00) [17]

Пишу пошагово (может за одно и саму станет ошибка видна).
При первом запуске проги в поле едит пишем слово "Статья".
Нажимаем кнопку и создаются панели таким образом:
procedure tform1.CreateBut;
Var
wer: TPanel;
s:string;
t:integer;
Begin
t:=0;
 s:=edit1.Text;
   repeat
   wer:=TPanel.Create(form1);
   inc(t);
   wer.Top:= random(350)+60;
   wer.Left:=random(350)+60;
   wer.Name:='but'+inttostr(t);
   wer.Caption:=s[t];
   wer.Font.Size:=16;
   wer.Parent:=form1;
   until t=length(edit1.Text);
t:=0;
end;

Затем закрываем форму.
В событии destroy пишем следующий код:
procedure TForm1.FormDestroy(Sender: TObject);
var
 Ini: Tinifile;
 s:string;
begin
s:=edit1.Text;
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'MyIni.ini');
if s<>'' then
ini.WriteString('Edit_Text', 'edit1', s)
else
ini.WriteString('Edit_Text', 'edit1', 'Статья');
Ini.Free;
end;

Потом при следующем запуске программы(событие Create) пишу следующее:
procedure TForm1.FormCreate(Sender: TObject);
var
 Ini: Tinifile;
 tr: integer;
begin
randomize;
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'MyIni.ini');
edit1.Text:=ini.ReadString('Edit_Text', 'edit1','Статья');
CreateBut;
Ini.Free;
end;


И в итоге: создаются нужное количество панелей ("Статья", шесть букв->шесть панелей),
но на панели на которой должна быть буква "я" - ничего нет.
В чем проблема? Какой-то нюанс упускаю, а вот какой подскажите, плиз.

ЗЫ. С подобным сталкивался при работе с OpenGl выводом текста, но так как был выбран другой путь реализации не стал разбираться в чем проблема:((... а стоило

ЗЫЫ. Часть кода опущена, но это на суть проблемы ни каим образом не влияет!


ASoft   (2007-07-20 04:50:00) [18]

...
> потом на каждый символ создается панель, и в свойство caption
> выводится по одному символу

как создаешь? кусок кода давай..


Наверх

Титульная страница Поиск, карта сайта Написать письмо