purebasic.info

PureBasic forum
Текущее время: Пн июн 18, 2018 3:22 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Undo и Redo в текстовом редакторе.
СообщениеДобавлено: Пт окт 05, 2007 12:07 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11178
Благодарил (а): 4 раз.
Поблагодарили: 414 раз.
Возможно эта информация пригодиться при написании текстового редактора.
Для начала, проведите небольшой экстеримент: запустите "Блокнот" и наберите любой текст, а затем в меню выберите пункт "отменить". Тоже самое проделайте и в редакторе Пурика.
Заметили разницу?
В "Блокноте" удаляются целые предложения, а в Пурике происходтит посимвольное удалеие при выборе пункта "Отменить".
Ну так вот. При написании текстового редактора, я столкнулся с этой проблемой, функции Undo и Redo работали как в "Блокноте", а я хотел чтобы работали как в Пурике.
После некоторых экспериментов мне это удалось. Но для начала посмотрите на первоначальный вариант
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
;--- Для компиляции программы требуется библиотека с функциями "LEP0 V0.4 Beta"
 
 
TempDir.s=GetTemporaryDirectory()
PrefFile.s=TempDir+"EditText.ini"
Gosub OpenPreferences
 
; Чтение одной строчки из редактора.
Procedure.s EditorItemText(Gadget.l, Item.l)
 
Item=Item+1
Count.l = CountGadgetItems(Gadget)
If Count=0 Or Item>Count
Result.s=""
Else
text.s=GetGadgetText(Gadget)
 
Result.s=StringField(text, Item, Chr(10)+Chr(13))
Result.s=ReplaceString(Result.s, Chr(10), "" )
Result.s=ReplaceString(Result.s, Chr(13), "" )
EndIf
 
ProcedureReturn  Result.s
EndProcedure
 
; Вставка текста
Procedure InsertEditorText(gadget,Text$)
  ProcedureReturn SendMessage_(GadgetID(gadget),#EM_REPLACESEL,0,Text$)
EndProcedure  
 
; Процедура, читает текст из файла.
Procedure LoadTextFile(Gadget,Filename.s)
If Filename<>""
TextHnd.l=OpenFile(#PB_Any,Filename.s)
If TextHnd
Textlg.l=Lof(TextHnd.l)
If Textlg
TextMemHnd.l=AllocateMemory(Textlg)
EndIf
If TextMemHnd
ReadData(TextHnd.l,TextMemHnd,Textlg)
SendMessage_(GadgetID(Gadget), #WM_SETTEXT,0, TextMemHnd)
FreeMemory(TextMemHnd)
EndIf
CloseFile(TextHnd)
Else
MessageRequester("Открытие файла","Не удалось открыть файл!",#MB_OK | #MB_ICONERROR)
EndIf
EndIf
ProcedureReturn TextHnd
EndProcedure
 
 
; Процедура, сохраняет текст в файле.
Procedure SaveTextFile(Gadget,Filename.s)
If Filename<>""
TextHnd.l=CreateFile(#PB_Any,Filename.s)
If TextHnd
Textlg.l=SendMessage_(GadgetID(Gadget), #WM_GETTEXTLENGTH,0,0)
If Textlg
TextMemHnd.l=AllocateMemory(Textlg)
EndIf
If TextMemHnd
SendMessage_(GadgetID(Gadget), #WM_GETTEXT,Textlg,TextMemHnd)
WriteData(TextHnd.l,TextMemHnd,Textlg)
FreeMemory(TextMemHnd)
EndIf
CloseFile(TextHnd)
Else
MessageRequester("Запись файла","Не удалось сохранить файл!",#MB_OK | #MB_ICONERROR)
EndIf
EndIf
ProcedureReturn TextHnd
EndProcedure
 
 
 
;---- Окно---
 
; Открываем окно.
If OpenWindow(0,0,0,550,400,"Текстовый редактор",#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_Invisible)
  If CreateGadgetList(WindowID(0))
  ; Создаём текстовый редактор.
  EditorGadget(0,1,28,548,350)
    ; Выбираем новый шрифт для редактора.
    If LoadFont(1,"Lucida Console", 10)
    SetGadgetFont(0,FontID(1))
    EndIf
  ; Устанавливаем максимальное количество символов в текстовом редакторе.
  Editor_SetLimitText(0,1000000000)
  ; Активируем редактор (помешаем туда курсор).
  Editor_Activate(0)
  SmartWindowRefresh(0, 1)
    ; Создаём меню.
    If CreateMenu(0, WindowID(0))
       ; Заголовок меню.
       MenuTitle("Файл")
    ; Пункты меню.
    MenuItem(1,"Новый"+Chr(9)+"Ctrl+N")
    MenuItem(2,"Открыть"+Chr(9)+"Ctrl+O")
    MenuItem(3,"Сохранить"+Chr(9)+"Ctrl+S")
    MenuItem(4,"Сохранить как")
    ;MenuBar()
   ; MenuItem(5,"Настройки")
    ; Разделитель между пунктами.
    MenuBar()
    MenuItem(6,"Выход")
       MenuTitle("Правка")
    MenuItem(7, "Отменить"+Chr(9)+"Ctrl+Z")
    MenuItem(8,"Повторить"+Chr(9)+"Ctrl+Y")
    MenuBar()
    MenuItem(9, "Вырезать"+Chr(9)+"Ctrl+X")
    MenuItem(10, "Копировать"+Chr(9)+"Ctrl+C")
    MenuItem(11, "Вставить"+Chr(9)+"Ctrl+V")
    MenuItem(12, "Удалить")
    MenuBar()
    MenuItem(13,"Выделить всё"+Chr(9)+"Ctrl+A")
    ;MenuBar()
    ;MenuItem(20,"Найти")
    ;MenuItem(21,"Найти далее")
   
       MenuTitle("О программе")
    MenuItem(14,"О программе")
 
    EndIf
   
    ; Создаём всплывающее меню
    If CreatePopupMenu(1)
    ; Добавляем пункты меню, дублирующие основное меню.
    MenuItem(7, "Отменить"+Chr(9)+"Ctrl+Z")
    MenuItem(8,"Повторить"+Chr(9)+"Ctrl+Y")
    MenuBar()
    MenuItem(9, "Вырезать"+Chr(9)+"Ctrl+X")
    MenuItem(10, "Копировать"+Chr(9)+"Ctrl+C")
    MenuItem(11, "Вставить"+Chr(9)+"Ctrl+V")
    MenuItem(12, "Удалить")
    MenuBar()
    MenuItem(13,"Выделить всё"+Chr(9)+"Ctrl+A")
    EndIf
   
    ; Создаём панель инструментов.
    If CreateToolBar(2,WindowID(0))
    ToolBarSeparator()
    ; Создаём на панели инструментов кнопку "Создать"
    ToolBarStandardButton(1, #PB_ToolBarIcon_New)
    ; Создаём на панели инструментов кнопку "Открыть"
    ToolBarStandardButton(2, #PB_ToolBarIcon_Open)
    ; Создаём на панели инструментов кнопку "Сохранить"
    ToolBarStandardButton(3, #PB_ToolBarIcon_Save)
    ToolBarSeparator()
    ; Создаём на панели инструментов кнопку "Вырезать"
    ToolBarStandardButton(9, #PB_ToolBarIcon_Cut)
    ; Создаём на панели инструментов кнопку "Копировать"
    ToolBarStandardButton(10, #PB_ToolBarIcon_Copy)
    ; Создаём на панели инструментов кнопку "Вставить"
    ToolBarStandardButton(11, #PB_ToolBarIcon_Paste)
    ToolBarSeparator()
    ; Создаём на панели инструментов кнопку "Отменить"
    ToolBarStandardButton(7, #PB_ToolBarIcon_Undo)
    ; Создаём на панели инструментов кнопку "Повторить"
    ToolBarStandardButton(8, #PB_ToolBarIcon_Redo)
    ToolBarSeparator()
    ; Добавляем подсказку для кнопки "Создать"
    ToolBarToolTip(2,1,"Создать новый файл")
    ; Добавляем подсказку для кнопки "Открыть"
    ToolBarToolTip(2,2,"Открыть файл")
    ToolBarToolTip(2,3,"Сохранить")
    ToolBarToolTip(2,7,"Отменить")
    ToolBarToolTip(2,8,"Повторить")
    ToolBarToolTip(2,9,"Вырезать")
    ToolBarToolTip(2,10,"Копировать")
    ToolBarToolTip(2,11,"Вставить")
   
    EndIf
   
  ; Создаём "горячие клавиши".
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_N,1)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_O,2)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_S,3)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_Z,7)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_Y,8)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_X,9)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_C,10)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_V,11)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_A,13)
 
  ; Создаём строку состояния.
  If CreateStatusBar(3,WindowID(0))
  ; Добавляем три раздела.
  AddStatusBarField(100)
  AddStatusBarField(100)
  AddStatusBarField(800)
  EndIf
 
 
 
  HideWindow(0,0)
  CursorX=1000 : CursorY=1000
 
; Читаем командную строку, если таковая имеется.
FileStart$ = ProgramParameter()
If FileStart$<>""
OpenFile.s=FileStart$
Gosub KomandnaStroka
EndIf
 
 
  Repeat
 
   
  Event=WaitWindowEvent()
  Gadget=EventGadget()
  Menu=EventMenu()
  Window=EventWindow()
 
  ; Узнаём текущее положение курсора.
  x=Editor_GetCursorX(0)
  y=Editor_GetCursorY(0)
 
   
  ; Проверяем изменились ли координаты курсора.
   If CursorX<>x Or CursorY<>y
   ; Если да, тогда выводим новые координаты
   StatusBarText(3, 0, " Строчка  "+Str(y+1))
   StatusBarText(3, 1, " Символ  "+Str(x))
   ; Запоминаем текущие координаты курсора.
   CursorX=x : CursorY=y
   EndIf
   
   ; Узнаём, какая клавиша была нажата последней.
   If Event=#WM_KEYDOWN And klava=0
    key=EventwParam()
    kk=1
      If key>=112 And key=<123
      Else
        If key>=33 And key=<40
        Else
          If key=17 Or key=91 Or key=92 Or key=93 Or key=16 Or key=20 Or key=27 Or key=255 Or key=95 Or key=19 Or key=144 Or key=12 Or key=45 Or key=145
          Else
          klava=1    
          EndIf
       EndIf
     EndIf
   EndIf
 
    ; Если изменился размер окна, меняем размер текстового редактора.
    If Event= #PB_Event_SizeWindow
    Width = WindowWidth(0)
    Height = WindowHeight(0)
    ResizeGadget(0,#PB_Ignore,#PB_Ignore,Width-2,Height-72)
    EndIf
   
    If Event= #WM_RBUTTONDOWN And WindowMouseY(0)>=30
    DisplayPopupMenu(1, WindowID(0))
    EndIf
       
   
    ; Обрабатываем события от меню.
    If Event= #PB_Event_Menu
      Select Menu
        Case 1
           ; Обработка события от пункта "Новый" меню.
           Gosub New_file
        Case 2
           ; Обработка события от пункта "Открыть" меню.
           Gosub Open_file
        Case 3
           ; Обработка события от пункта "Сохранить" меню.
           Gosub Save
        Case 4
           ; Обработка события от пункта "Сохранить как" меню.
           Gosub Save_As
        Case 5
           ; Обработка события от пункта "Настройки" меню.
         ;  Gosub Nastroyki
        Case 6
           ; Обработка события от пункта "Выход" меню.
           Exit=1
        Case 7
           ; Обработка события от пункта "Отменить" меню.
           Editor_Undo(0)
           klava=1
        Case 8
           ; Обработка события от пункта "Повторить" меню.
           Editor_Redo(0)
           klava=1
        Case 9
           ; Обработка события от пункта "Вырезать" меню.
           Editor_Cut(0)
           klava=1
        Case 10
           ; Обработка события от пункта "Копировать" меню.
           Editor_Copy(0)
           
        Case 11
           ; Обработка события от пункта "Вставить" меню.
           Editor_Paste(0)
           klava=1
        Case 12
           ; Обработка события от пункта "Удалить" меню.
           Editor_Delete(0)
           klava=1
        Case 13
           ; Обработка события от пункта "Выделить всё" меню.
           Editor_SelectAll(0)
        Case 14
           ; Обработка события от пункта "О программе" меню.
          ; MessageRequester("","В данной версии эта возможность не реализована.")
          If OW1=0
            If OpenWindow(1,0,0,300,150,"О программе",#PB_Window_MinimizeGadget |#PB_Window_ScreenCentered )
             If CreateGadgetList(WindowID(1))
               OW1=1 : SetActiveWindow(1)
               ButtonGadget(20,105,110,80,25,"Закрыть")
               TextGadget(21,90,50,200,15,"Текстовый редактор")
               TextGadget(22,110,70,150,15,"Автор:  Пётр")
              EndIf
            EndIf
          EndIf
         
       
      EndSelect
 
    EndIf
 
 If Window=1
   If Event=#PB_Event_CloseWindow Or Gadget=20
    CloseWindow(1): OW1=0
   EndIf
 EndIf
 
 
 
 
 
    If Event=#PB_Event_CloseWindow And Window=0
    Gosub ExitEditor
    EndIf
   
  Until Exit=1
  EndIf
EndIf
End
 
 
 
; Подпрограмма, открывающая файл.
Open:
OpenFile.s=OpenFileRequester("Открыть файл", "", "*.txt, *.asm|*.txt;*.asm|All Files|*.*", 0)
KomandnaStroka:
If OpenFile<>""
  ; Вызываем процедуру, открывающую файл
  If LoadTextFile(0,OpenFile)
  ; Если файл был открыт, тогда записываем в переменную FileX.s
  ; имя этого файла.
  FileX.s=OpenFile
  ; Выводим путь к открытому файлу в строке состояния.
  StatusBarText(3,2,FileX)
  EndIf
EndIf
Return
 
 
; Подпрограмма, сохраняющая открытый файл.
Save:
; Проверяем есть ли открытый файл.
If FileX.s=""
; Открытого файла нет, поэтому вызываем подпрограмму Save_As.
Gosub Save_As
Else
; Открытый файл есть, поэтому сохраняем файл.
ResultSave=SaveTextFile(0,FileX.s)
EndIf
Return
 
 
; Подпрограмма, сохраняющая файл
Save_As:
SaveFile.s=SaveFileRequester("Сохранение файла", "", "*.txt|*.txt;|All Files|*.*", 0)
; Проверяем, был ли выбран файл.
If SaveFile<>""
  ; Проверяем есть ли расширение у выбранного файла.
  If GetExtensionPart(SaveFile)=""
  ; Если его нет, тогда добавляем расширение "txt".
  SaveFile=SaveFile+".txt"
  EndIf
; Сохраняем файл.
  ResultSave=SaveTextFile(0,SaveFile.s)
 
  If ResultSave ; Если файл был сохранён, записываем в переменную FileX имя этого файла.
  FileX.s=SaveFile
 
  ; Выводим путь к открытому файлу в строке состояния.
  StatusBarText(3,2,FileX)
  EndIf
EndIf
Return
 
 
 
New_file:
If  klava=1
res=MessageRequester(" Редактор файлов","  Текст в файле  был изменён,"+Chr(10)+Chr(13)+"      сохранить  измненния?",#PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
Select res
Case #PB_MessageRequester_Yes
Gosub Save
If ResultSave
klava=0
ClearGadgetItemList(0)
FileX.s=""
;Выводим путь к открытому файлу в строке состояния.
StatusBarText(3,2,FileX)
Else
klava=0
ClearGadgetItemList(0)
FileX.s=""
;Выводим путь к открытому файлу в строке состояния.
StatusBarText(3,2,FileX)
EndIf
 
Case #PB_MessageRequester_No
klava=0
ClearGadgetItemList(0)
FileX.s=""
;Выводим путь к открытому файлу в строке состояния.
StatusBarText(3,2,FileX)
 
EndSelect
EndIf
Return
 
 
Open_file:
If klava=1
res=MessageRequester(" Редактор файлов","  Текст в файле  был изменён,"+Chr(10)+Chr(13)+"      сохранить  измненния?",#PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
Select res
Case #PB_MessageRequester_Yes
Gosub Save
 
If  ResultSave
klava=0
 Gosub Open
EndIf
Case #PB_MessageRequester_No
klava=0
Gosub Open
EndSelect
Else
 Gosub Open
EndIf
Return
 
ExitEditor:
If klava=1
res=MessageRequester(" Редактор файлов","  Текст в файле  был изменён,"+Chr(10)+Chr(13)+"      сохранить  измненния?",#PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
Select res
Case #PB_MessageRequester_Yes
Gosub Save
If  ResultSave
klava=0
Exit=1
EndIf
Case #PB_MessageRequester_No
klava=0
Exit=1
EndSelect
Else
Exit=1
EndIf
Return
 
OpenPreferences:
PrId=OpenPreferences(PrefFile)
   PreferenceGroup("Окно")
 WinWidth=ReadPreferenceLong("Ширина окна", 400)
 WinHeight=ReadPreferenceLong("Высота окна", 300)
 
 
Return
 
 


А вот немного переделаный вариант, где функции отменить и повторить работают как в Пурике.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
;--- Для компиляции программы требуется библиотека с функциями "LEP0 V0.4 Beta"
 
 
TempDir.s=GetTemporaryDirectory()
PrefFile.s=TempDir+"EditText.ini"
Gosub OpenPreferences
 
; Чтение одной строчки из редактора.
Procedure.s EditorItemText(Gadget.l, Item.l)
 
Item=Item+1
Count.l = CountGadgetItems(Gadget)
If Count=0 Or Item>Count
Result.s=""
Else
text.s=GetGadgetText(Gadget)
 
Result.s=StringField(text, Item, Chr(10)+Chr(13))
Result.s=ReplaceString(Result.s, Chr(10), "" )
Result.s=ReplaceString(Result.s, Chr(13), "" )
EndIf
 
ProcedureReturn  Result.s
EndProcedure
 
; Вставка текста
Procedure InsertEditorText(gadget,Text$)
  ProcedureReturn SendMessage_(GadgetID(gadget),#EM_REPLACESEL,0,Text$)
EndProcedure  
 
; Процедура, читает текст из файла.
Procedure LoadTextFile(Gadget,Filename.s)
If Filename<>""
TextHnd.l=OpenFile(#PB_Any,Filename.s)
If TextHnd
Textlg.l=Lof(TextHnd.l)
If Textlg
TextMemHnd.l=AllocateMemory(Textlg)
EndIf
If TextMemHnd
ReadData(TextHnd.l,TextMemHnd,Textlg)
SendMessage_(GadgetID(Gadget), #WM_SETTEXT,0, TextMemHnd)
FreeMemory(TextMemHnd)
EndIf
CloseFile(TextHnd)
Else
MessageRequester("Открытие файла","Не удалось открыть файл!",#MB_OK | #MB_ICONERROR)
EndIf
EndIf
ProcedureReturn TextHnd
EndProcedure
 
 
; Процедура, сохраняет текст в файле.
Procedure SaveTextFile(Gadget,Filename.s)
If Filename<>""
TextHnd.l=CreateFile(#PB_Any,Filename.s)
If TextHnd
Textlg.l=SendMessage_(GadgetID(Gadget), #WM_GETTEXTLENGTH,0,0)
If Textlg
TextMemHnd.l=AllocateMemory(Textlg)
EndIf
If TextMemHnd
SendMessage_(GadgetID(Gadget), #WM_GETTEXT,Textlg,TextMemHnd)
WriteData(TextHnd.l,TextMemHnd,Textlg)
FreeMemory(TextMemHnd)
EndIf
CloseFile(TextHnd)
Else
MessageRequester("Запись файла","Не удалось сохранить файл!",#MB_OK | #MB_ICONERROR)
EndIf
EndIf
ProcedureReturn TextHnd
EndProcedure
 
 
 
;---- Окно---
 
; Открываем окно.
If OpenWindow(0,0,0,550,400,"Текстовый редактор",#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered | #PB_Window_Invisible)
  If CreateGadgetList(WindowID(0))
  ; Создаём текстовый редактор.
  EditorGadget(0,1,28,548,350)
    ; Выбираем новый шрифт для редактора.
    If LoadFont(1,"Lucida Console", 10)
    SetGadgetFont(0,FontID(1))
    EndIf
  ; Устанавливаем максимальное количество символов в текстовом редакторе.
  Editor_SetLimitText(0,1000000000)
  ; Активируем редактор (помешаем туда курсор).
  Editor_Activate(0)
  SmartWindowRefresh(0, 1)
    ; Создаём меню.
    If CreateMenu(0, WindowID(0))
       ; Заголовок меню.
       MenuTitle("Файл")
    ; Пункты меню.
    MenuItem(1,"Новый"+Chr(9)+"Ctrl+N")
    MenuItem(2,"Открыть"+Chr(9)+"Ctrl+O")
    MenuItem(3,"Сохранить"+Chr(9)+"Ctrl+S")
    MenuItem(4,"Сохранить как")
    ;MenuBar()
   ; MenuItem(5,"Настройки")
    ; Разделитель между пунктами.
    MenuBar()
    MenuItem(6,"Выход")
       MenuTitle("Правка")
    MenuItem(7, "Отменить"+Chr(9)+"Ctrl+Z")
    MenuItem(8,"Повторить"+Chr(9)+"Ctrl+Y")
    MenuBar()
    MenuItem(9, "Вырезать"+Chr(9)+"Ctrl+X")
    MenuItem(10, "Копировать"+Chr(9)+"Ctrl+C")
    MenuItem(11, "Вставить"+Chr(9)+"Ctrl+V")
    MenuItem(12, "Удалить")
    MenuBar()
    MenuItem(13,"Выделить всё"+Chr(9)+"Ctrl+A")
    ;MenuBar()
    ;MenuItem(20,"Найти")
    ;MenuItem(21,"Найти далее")
   
       MenuTitle("О программе")
    MenuItem(14,"О программе")
 
    EndIf
   
    ; Создаём всплывающее меню
    If CreatePopupMenu(1)
    ; Добавляем пункты меню, дублирующие основное меню.
    MenuItem(7, "Отменить"+Chr(9)+"Ctrl+Z")
    MenuItem(8,"Повторить"+Chr(9)+"Ctrl+Y")
    MenuBar()
    MenuItem(9, "Вырезать"+Chr(9)+"Ctrl+X")
    MenuItem(10, "Копировать"+Chr(9)+"Ctrl+C")
    MenuItem(11, "Вставить"+Chr(9)+"Ctrl+V")
    MenuItem(12, "Удалить")
    MenuBar()
    MenuItem(13,"Выделить всё"+Chr(9)+"Ctrl+A")
    EndIf
   
    ; Создаём панель инструментов.
    If CreateToolBar(2,WindowID(0))
    ToolBarSeparator()
    ; Создаём на панели инструментов кнопку "Создать"
    ToolBarStandardButton(1, #PB_ToolBarIcon_New)
    ; Создаём на панели инструментов кнопку "Открыть"
    ToolBarStandardButton(2, #PB_ToolBarIcon_Open)
    ; Создаём на панели инструментов кнопку "Сохранить"
    ToolBarStandardButton(3, #PB_ToolBarIcon_Save)
    ToolBarSeparator()
    ; Создаём на панели инструментов кнопку "Вырезать"
    ToolBarStandardButton(9, #PB_ToolBarIcon_Cut)
    ; Создаём на панели инструментов кнопку "Копировать"
    ToolBarStandardButton(10, #PB_ToolBarIcon_Copy)
    ; Создаём на панели инструментов кнопку "Вставить"
    ToolBarStandardButton(11, #PB_ToolBarIcon_Paste)
    ToolBarSeparator()
    ; Создаём на панели инструментов кнопку "Отменить"
    ToolBarStandardButton(7, #PB_ToolBarIcon_Undo)
    ; Создаём на панели инструментов кнопку "Повторить"
    ToolBarStandardButton(8, #PB_ToolBarIcon_Redo)
    ToolBarSeparator()
    ; Добавляем подсказку для кнопки "Создать"
    ToolBarToolTip(2,1,"Создать новый файл")
    ; Добавляем подсказку для кнопки "Открыть"
    ToolBarToolTip(2,2,"Открыть файл")
    ToolBarToolTip(2,3,"Сохранить")
    ToolBarToolTip(2,7,"Отменить")
    ToolBarToolTip(2,8,"Повторить")
    ToolBarToolTip(2,9,"Вырезать")
    ToolBarToolTip(2,10,"Копировать")
    ToolBarToolTip(2,11,"Вставить")
   
    EndIf
   
  ; Создаём "горячие клавиши".
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_N,1)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_O,2)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_S,3)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_Z,7)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_Y,8)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_X,9)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_C,10)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_V,11)
  AddKeyboardShortcut(0,#PB_Shortcut_Control | #PB_Shortcut_A,13)
 
  ; Создаём строку состояния.
  If CreateStatusBar(3,WindowID(0))
  ; Добавляем три раздела.
  AddStatusBarField(100)
  AddStatusBarField(100)
  AddStatusBarField(800)
  EndIf
 
  Language=TEditor_SH_CreateLanguage("Edit",4)
  TEditor_SH_SetState(0,Language.l,1)
 
  HideWindow(0,0)
  CursorX=1000 : CursorY=1000
 
; Читаем командную строку, если таковая имеется.
FileStart$ = ProgramParameter()
If FileStart$<>""
OpenFile.s=FileStart$
Gosub KomandnaStroka
EndIf
 
 
  Repeat
  TEditor_SH_Update(0)
   
  Event=WaitWindowEvent()
  Gadget=EventGadget()
  Menu=EventMenu()
  Window=EventWindow()
 
  ; Узнаём текущее положение курсора.
  x=Editor_GetCursorX(0)
  y=Editor_GetCursorY(0)
 
   
  ; Проверяем изменились ли координаты курсора.
   If CursorX<>x Or CursorY<>y
   ; Если да, тогда выводим новые координаты
   StatusBarText(3, 0, " Строчка  "+Str(y+1))
   StatusBarText(3, 1, " Символ  "+Str(x))
   ; Запоминаем текущие координаты курсора.
   CursorX=x : CursorY=y
   EndIf
   
   ; Узнаём, какая клавиша была нажата последней.
   If Event=#WM_KEYDOWN And klava=0
    key=EventwParam()
    kk=1
      If key>=112 And key=<123
      Else
        If key>=33 And key=<40
        Else
          If key=17 Or key=91 Or key=92 Or key=93 Or key=16 Or key=20 Or key=27 Or key=255 Or key=95 Or key=19 Or key=144 Or key=12 Or key=45 Or key=145
          Else
          klava=1    
          EndIf
       EndIf
     EndIf
   EndIf
 
    ; Если изменился размер окна, меняем размер текстового редактора.
    If Event= #PB_Event_SizeWindow
    Width = WindowWidth(0)
    Height = WindowHeight(0)
    ResizeGadget(0,#PB_Ignore,#PB_Ignore,Width-2,Height-72)
    EndIf
   
    If Event= #WM_RBUTTONDOWN And WindowMouseY(0)>=30
    DisplayPopupMenu(1, WindowID(0))
    EndIf
       
   
    ; Обрабатываем события от меню.
    If Event= #PB_Event_Menu
      Select Menu
        Case 1
           ; Обработка события от пункта "Новый" меню.
           Gosub New_file
        Case 2
           ; Обработка события от пункта "Открыть" меню.
           Gosub Open_file
        Case 3
           ; Обработка события от пункта "Сохранить" меню.
           Gosub Save
        Case 4
           ; Обработка события от пункта "Сохранить как" меню.
           Gosub Save_As
        Case 5
           ; Обработка события от пункта "Настройки" меню.
         ;  Gosub Nastroyki
        Case 6
           ; Обработка события от пункта "Выход" меню.
           Exit=1
        Case 7
           ; Обработка события от пункта "Отменить" меню.
           Editor_Undo(0)
           klava=1
        Case 8
           ; Обработка события от пункта "Повторить" меню.
           Editor_Redo(0)
           klava=1
        Case 9
           ; Обработка события от пункта "Вырезать" меню.
           Editor_Cut(0)
           klava=1
        Case 10
           ; Обработка события от пункта "Копировать" меню.
           Editor_Copy(0)
           
        Case 11
           ; Обработка события от пункта "Вставить" меню.
           Editor_Paste(0)
           klava=1
        Case 12
           ; Обработка события от пункта "Удалить" меню.
           Editor_Delete(0)
           klava=1
        Case 13
           ; Обработка события от пункта "Выделить всё" меню.
           Editor_SelectAll(0)
        Case 14
           ; Обработка события от пункта "О программе" меню.
          ; MessageRequester("","В данной версии эта возможность не реализована.")
          If OW1=0
            If OpenWindow(1,0,0,300,150,"О программе",#PB_Window_MinimizeGadget |#PB_Window_ScreenCentered )
             If CreateGadgetList(WindowID(1))
               OW1=1 : SetActiveWindow(1)
               ButtonGadget(20,105,110,80,25,"Закрыть")
               TextGadget(21,90,50,200,15,"Текстовый редактор")
               TextGadget(22,110,70,150,15,"Автор:  Пётр")
              EndIf
            EndIf
          EndIf
         
       
      EndSelect
 
    EndIf
 
 If Window=1
   If Event=#PB_Event_CloseWindow Or Gadget=20
    CloseWindow(1): OW1=0
   EndIf
 EndIf
 
 
 
 
 
    If Event=#PB_Event_CloseWindow And Window=0
    Gosub ExitEditor
    EndIf
   
  Until Exit=1
  EndIf
EndIf
End
 
 
 
; Подпрограмма, открывающая файл.
Open:
OpenFile.s=OpenFileRequester("Открыть файл", "", "*.txt, *.asm|*.txt;*.asm|All Files|*.*", 0)
KomandnaStroka:
If OpenFile<>""
  ; Вызываем процедуру, открывающую файл
  If LoadTextFile(0,OpenFile)
  ; Если файл был открыт, тогда записываем в переменную FileX.s
  ; имя этого файла.
  FileX.s=OpenFile
  ; Выводим путь к открытому файлу в строке состояния.
  StatusBarText(3,2,FileX)
  EndIf
EndIf
Return
 
 
; Подпрограмма, сохраняющая открытый файл.
Save:
; Проверяем есть ли открытый файл.
If FileX.s=""
; Открытого файла нет, поэтому вызываем подпрограмму Save_As.
Gosub Save_As
Else
; Открытый файл есть, поэтому сохраняем файл.
ResultSave=SaveTextFile(0,FileX.s)
EndIf
Return
 
 
; Подпрограмма, сохраняющая файл
Save_As:
SaveFile.s=SaveFileRequester("Сохранение файла", "", "*.txt|*.txt;|All Files|*.*", 0)
; Проверяем, был ли выбран файл.
If SaveFile<>""
  ; Проверяем есть ли расширение у выбранного файла.
  If GetExtensionPart(SaveFile)=""
  ; Если его нет, тогда добавляем расширение "txt".
  SaveFile=SaveFile+".txt"
  EndIf
; Сохраняем файл.
  ResultSave=SaveTextFile(0,SaveFile.s)
 
  If ResultSave ; Если файл был сохранён, записываем в переменную FileX имя этого файла.
  FileX.s=SaveFile
 
  ; Выводим путь к открытому файлу в строке состояния.
  StatusBarText(3,2,FileX)
  EndIf
EndIf
Return
 
 
 
New_file:
If  klava=1
res=MessageRequester(" Редактор файлов","  Текст в файле  был изменён,"+Chr(10)+Chr(13)+"      сохранить  измненния?",#PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
Select res
Case #PB_MessageRequester_Yes
Gosub Save
If ResultSave
klava=0
ClearGadgetItemList(0)
FileX.s=""
;Выводим путь к открытому файлу в строке состояния.
StatusBarText(3,2,FileX)
Else
klava=0
ClearGadgetItemList(0)
FileX.s=""
;Выводим путь к открытому файлу в строке состояния.
StatusBarText(3,2,FileX)
EndIf
 
Case #PB_MessageRequester_No
klava=0
ClearGadgetItemList(0)
FileX.s=""
;Выводим путь к открытому файлу в строке состояния.
StatusBarText(3,2,FileX)
 
EndSelect
EndIf
Return
 
 
Open_file:
If klava=1
res=MessageRequester(" Редактор файлов","  Текст в файле  был изменён,"+Chr(10)+Chr(13)+"      сохранить  измненния?",#PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
Select res
Case #PB_MessageRequester_Yes
Gosub Save
 
If  ResultSave
klava=0
 Gosub Open
EndIf
Case #PB_MessageRequester_No
klava=0
Gosub Open
EndSelect
Else
 Gosub Open
EndIf
Return
 
ExitEditor:
If klava=1
res=MessageRequester(" Редактор файлов","  Текст в файле  был изменён,"+Chr(10)+Chr(13)+"      сохранить  измненния?",#PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
Select res
Case #PB_MessageRequester_Yes
Gosub Save
If  ResultSave
klava=0
Exit=1
EndIf
Case #PB_MessageRequester_No
klava=0
Exit=1
EndSelect
Else
Exit=1
EndIf
Return
 
OpenPreferences:
PrId=OpenPreferences(PrefFile)
   PreferenceGroup("Окно")
 WinWidth=ReadPreferenceLong("Ширина окна", 400)
 WinHeight=ReadPreferenceLong("Высота окна", 300)
 
 
Return
 
 


Теперь найдите 3 отличия. :D
На самом деле в исходник было добавлено 3 функции, на первый взгляд ну никак не связаных с функцмями "Отменить" и "Повторить"
Это функции TEditor_SH_CreateLanguage, TEditor_SH_SetState и TEditor_SH_Update, которые изначально предназначены для подсветки синтаксиса.

Дла компиляции программ тредуется библиотека LEP0 V0.4 Beta которую можно найти на файлообменике Влада.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB