Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

Проблема с "я"   Найти похожие ветки 

 
vasIZmax ©   (2007-07-20 03:05) [0]

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

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


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

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

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


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

Пишу пошагово (может за одно и саму станет ошибка видна).
При первом запуске проги в поле едит пишем слово "Статья".
Нажимаем кнопку и создаются панели таким образом:
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 06:21) [3]

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

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 06:25) [4]


> ASoft   (20.07.07 06:21) [3]


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

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


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


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

а ты проверь


 
vasIZmax ©   (2007-07-20 06:46) [6]


> ASoft   (20.07.07 06:40) [5]

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


 
ASoft   (2007-07-20 07:18) [7]

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


 
ASoft   (2007-07-20 07:32) [8]

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


 
vasIZmax ©   (2007-07-20 07:37) [9]


> ASoft   (20.07.07 07:32) [8]

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

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


 
Anatoly Podgoretsky ©   (2007-07-20 07:45) [10]

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

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


 
vasIZmax ©   (2007-07-20 08:17) [11]


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

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


 
Desdechado ©   (2007-07-20 10:45) [12]

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


 
vasIZmax ©   (2007-07-20 11:01) [13]


> 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.


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

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


 
Ivolg ©   (2007-07-20 11:13) [14]

Можно так:

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;


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


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


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


 
Ivolg ©   (2007-07-20 11:43) [16]

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

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;


 
vasIZmax ©   (2007-07-20 11:46) [17]


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

Имхо,

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

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


 
Stanislav ©   (2007-07-20 12:22) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.025 c
2-1184496516
vegarulez
2007-07-15 14:48
2007.08.19
Эдит энабле:=фалсе, как сделать фонт цветом, как в труе?


15-1185117642
Kostafey
2007-07-22 19:20
2007.08.19
Чтобы клавитуру не ломать...


15-1185259056
jack128_
2007-07-24 10:37
2007.08.19
Демки


15-1185175924
Nic
2007-07-23 11:32
2007.08.19
Нужно покупать хорошие блоки питания


11-1168263971
mixail_shar
2007-01-08 16:46
2007.08.19
Замечание по КНИГЕ