purebasic.info

PureBasic forum
Текущее время: Вс апр 22, 2018 4:15 am

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




Начать новую тему Ответить на тему  [ Сообщений: 95 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.
Автор Сообщение
 Заголовок сообщения: TreeGadget
СообщениеДобавлено: Пт мар 03, 2017 9:02 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 397
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Всем привет. Подскажите как из этого:
Код:
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
Procedure ListFilesRecursive(Dir.s, List Files.s())
  NewList Directories.s()
  If Right(Dir, 1) <> "\"
    Dir + "\"
  EndIf
  D = ExamineDirectory(#PB_Any, Dir, "")
  While NextDirectoryEntry(D)
    Select DirectoryEntryType(D)
      Case #PB_DirectoryEntry_File
        If LCase(Right(DirectoryEntryName(D),4))=".txt"
          AddElement(Files())
          Files() = Dir + DirectoryEntryName(D)
        EndIf
      Case #PB_DirectoryEntry_Directory
        Select DirectoryEntryName(D)
          Case ".", ".."
            Continue
          Default
            AddElement(Directories())
            Directories() = Dir + DirectoryEntryName(D)
        EndSelect
    EndSelect
  Wend
  FinishDirectory(D)
  ForEach Directories()
    ListFilesRecursive(Directories(), Files())
  Next
EndProcedure
 
NewList F.s()
ListFilesRecursive("D:\-----2017\", F())
ForEach F()
  Debug F()
Next


построить дерево? Вообще задача сводится к тому, чтобы также отображать содержимое выбранного файла/нода. В некоторм роде chm нужно получить. Или как из такого списка создать chm?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 11:23 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
knower писал(а):
как из такого списка создать chm?
Справку в формате chm? :shock:

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 12:03 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 397
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Пётр, даже не знаю как подойти к вопросу, поэтому возможно не так выразился. Вобщем, дан некий каталог (корневой/опорный). Все его подкаталоги нужно перебрать на наличие *.txt файлов и занести в список. Вот из этого списка уже нужно построить дерево. Иерархия внутри корневого каталога может быть какая угодно (заранее неизвестно). Что-то типа этого:
Код:
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
Global dirlevel.b
 
Procedure ScanPath(Path.s)
  Protected dir.l, name.s, files.l
  Dirlevel = Dirlevel + 1
  dir = ExamineDirectory(#PB_Any, Path, "")
  If dir
    While NextDirectoryEntry(dir)
      name = DirectoryEntryName(dir)
      If DirectoryEntryType(dir) = #PB_DirectoryEntry_File      
          files + 1
          AddGadgetItem(0, -1, name + "  -  " + Str(DirectoryEntrySize(dir)) ,0 , Dirlevel )
      EndIf
    Wend
    FinishDirectory(dir)
  EndIf
 
  dir = ExamineDirectory(#PB_Any, Path, "")
  If dir
    While NextDirectoryEntry(dir)
      name = DirectoryEntryName(dir)
      If name <> "." And name <> ".." And DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory
          AddGadgetItem(0, -1, name ,0 , Dirlevel)
          files + ScanPath(Path + name + "\")
      EndIf
    Wend
    FinishDirectory(dir)
  EndIf
  Dirlevel = Dirlevel - 1
  ProcedureReturn files
EndProcedure
 
OpenWindow(0, 0, 0, 600, 600, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TreeGadget(0, 10, 10, 580, 580)      
AddGadgetItem(0, -1, "D:\-----2017\" ,0 , 0)
Debug ScanPath("D:\-----2017\")
 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow



Проблема в том, что это ещё не всё. Нужно справа от дерева также отображать содержимое выделенного в дереве файла. Что тут предпринять можно? базу sqlite создать? И как это дерево можно сохранить, чтобы каждый раз не сканировать папки (так как их может быть много).
Посмотрел Ваш пример работы с ини:
Код:
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
Enumeration
  #Window_0
EndEnumeration
 
 
Enumeration
  #Text_0
  #String_0
  #Button_0
  #Text_1
  #Tree_0
  #Text_2
  #String_1
EndEnumeration
 
Global NewList Preference_KeyValue.s()
 
Procedure ScanINI_File(FileName.s)
  PosList=0
  SetGadgetText(#String_1,"")
  ClearGadgetItems(#Tree_0)
  ClearList(Preference_KeyValue())
  If OpenPreferences(FileName)
    If ExaminePreferenceGroups()
      While NextPreferenceGroup()
        AddGadgetItem(#Tree_0,-1,PreferenceGroupName(),0,0)
        If  ExaminePreferenceKeys()
          While NextPreferenceKey()
            AddGadgetItem(#Tree_0,-1,PreferenceKeyName(),0,1)
            AddElement(Preference_KeyValue())
            Preference_KeyValue()=PreferenceKeyValue()
            SetGadgetItemData(#Tree_0, CountGadgetItems(#Tree_0)-1, PosList)
            PosList+1
          Wend
        EndIf
      Wend
    EndIf
   
    x=0
    PreferenceGroup("")
    If ExaminePreferenceKeys()
      While NextPreferenceKey()
        If x=0
          AddGadgetItem(#Tree_0,-1,"Ключи без раздела",0,0)
          x=1
        EndIf
        AddGadgetItem(#Tree_0,-1,PreferenceKeyName(),0,1)
        AddElement(Preference_KeyValue())
        Preference_KeyValue()=PreferenceKeyValue()
        SetGadgetItemData(#Tree_0, CountGadgetItems(#Tree_0)-1, PosList)
        PosList+1
      Wend
    EndIf
    ClosePreferences()
  Else
    MessageRequester("", "Нет файла", #MB_OK|#MB_ICONERROR)
  EndIf
EndProcedure
 
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 303, 234, 399, 335, "Просмотр INI файла",  #PB_Window_MinimizeGadget | #PB_Window_Invisible | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
      TextGadget(#Text_0, 5, 10, 100, 15, "Путь к INI файлу:")
      StringGadget(#String_0, 105, 5, 255, 20, "", #PB_String_ReadOnly) ;: DisableGadget(#String_0, 1)
       SetGadgetColor(#String_0, #PB_Gadget_BackColor, $F0F0F0)
      ButtonGadget(#Button_0, 365, 5, 30, 20, "....")
      TextGadget(#Text_1, 5, 35, 100, 15, "Структура файла:")
      TreeGadget(#Tree_0, 5, 50, 180, 280, #PB_Tree_AlwaysShowSelection)
      TextGadget(#Text_2, 195, 35, 180, 15, "Данные ключа:")
      StringGadget(#String_1, 190, 50, 205, 280, "", 2099207) ;: DisableGadget(#String_1, 1)
       SetGadgetColor(#String_1, #PB_Gadget_BackColor, $F0F0F0)
      HideWindow(#Window_0, 0)
  EndIf
EndProcedure
 
Open_Window_0()
 
Repeat
  Event=WaitWindowEvent()
  If Event=#PB_Event_Gadget
    If EventGadget()=#Button_0
      File.s=OpenFileRequester("","","INI файлы|*.ini|Все файлы|*.*",0)
      If File<>"" And FileSize(File)>0
        SetGadgetText(#String_0,File)
        ScanINI_File(File)
      Else
        SetGadgetText(#String_0,"")
        SetGadgetText(#String_1,"")
        ClearGadgetItems(#Tree_0)
      EndIf
     
    ElseIf EventGadget()=#Tree_0
      If EventType()=#PB_EventType_LeftClick
        Pos=GetGadgetState(#Tree_0)
        If GetGadgetItemAttribute(#Tree_0,Pos, #PB_Tree_SubLevel)=1
          PosList=GetGadgetItemData(#Tree_0, Pos)
          SelectElement(Preference_KeyValue(), PosList)
          SetGadgetText(#String_1,Preference_KeyValue())
        EndIf
      EndIf
    EndIf
  EndIf
Until Event=#PB_Event_CloseWindow


думал сделать подобное, только в значение ключа хранить ссылку в базу. Извиняюсь за сумбур, плохо представляю реализацию. И подозреваю что решать эту задачу нужно по-другому.

Или может какой создатель Chm-файлов есть, которому подсунул список, а он построил дерево. Опять же нужно также содержимое считать каждого. Короче говоря нужно избавиться от тонны мелких файликов раскиданных по подпапкам и создать chm-файл. Только структура папок, где они были расположены должна быть сохранена и отображена в дереве.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 12:34 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт ноя 22, 2016 7:59 am
Сообщений: 63
Откуда: Россия/Пятигорск
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Для хранения деревьев отлично подходит XML. В пурике есть пример чтения дерева из xml-файла (XML.pb).
Также можно сделать подобное, используя JSON (но XML удобнее)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 12:38 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Упаковать файлы в архив не вариант?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 12:52 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 397
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Пётр, файлы должны "уйти". За вместо них должен образоваться один. Подразумевается упаковать все файлы в один архив? В принципе, мысль, но это будет громоздко.
Сейчас ещё дерево русуется неправильно. В него попадают пустые каталоги, а также не пустые но без текстовых файлов внутри.

alone67, спасибо. Посмотрю.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 1:06 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт ноя 22, 2016 7:59 am
Сообщений: 63
Откуда: Россия/Пятигорск
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
knower писал(а):
[b]Сейчас ещё дерево русуется неправильно. В него попадают пустые каталоги, а также не пустые но без текстовых файлов внутри.

А если так:
Код:
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
 
Procedure GetListFiles(List fileList.s(), dir$, pattern$="*.*", recursive=1)
  Protected res = ExamineDirectory(#PB_Any, dir$, "*.*"), entryName$, mask$
 
  If res
    mask$ = ReplaceString(pattern$, ".", "\.")
    mask$ = ReplaceString(mask$, "?", ".?")
    mask$ = ReplaceString(mask$, "*", ".*")
    NewList masks.s()
    For i = 0 To CountString(pattern$, ";")
      AddElement(masks())
      masks() = "^" + StringField(mask$, i + 1, ";") + "$"
    Next
   
    While NextDirectoryEntry(res)
      entryName$ = DirectoryEntryName(res)
      If DirectoryEntryType(res) = #PB_DirectoryEntry_File
        ForEach masks()
          If CreateRegularExpression(0, masks(), #PB_RegularExpression_NoCase)
            If MatchRegularExpression(0, entryName$)
              AddElement(fileList())
              fileList() = dir$ + entryName$
              FreeRegularExpression(0)
              Break
            EndIf
            FreeRegularExpression(0)
          EndIf
        Next
      Else
        If recursive And Left(entryName$, 1) <> "."
          GetListFiles(fileList(), dir$ + entryName$ + "\", pattern$, recursive)
        EndIf
      EndIf
    Wend
    FinishDirectory(res)
  EndIf
EndProcedure
 
 
NewList files.s()
GetListFiles(files(), "d:\", "*.sln", 1)
ForEach files()
  Debug files()
Next
 


Может быть указано несколько шаблонов, разделенных символом ";". В шаблонах поддерживаются символы "*" и "?".


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 1:24 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 296
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Для древовидных структур Евгений Анатольевич Каратаев
http://www.minimdb.com/mbook/mbook.html
сделал подарок ещё в прошлом релизе 1.26
http://www.minimdb.com/download/release-notes-1.26.html
MiniMono локальный вариант бесплатен для всех платформ
http://www.minimdb.com/minimonoru.html


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 1:34 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
knower писал(а):
Подразумевается упаковать все файлы в один архив? В принципе, мысль, но это будет громоздко.
В каком смысле громоздко? Файлы будут сжаты.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 4:15 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 397
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Пётр, в плане написания кода программы.
alone67, спасибо за вариант с регэкспом.
jobless, спасибо.

все, сегодня уже не смогу ответить.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Сб мар 04, 2017 4:50 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
knower писал(а):
в плане написания кода программы.
Код отображающий список файлов в zip архиве. Не сказал бы что сложный.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UseZipPacker()
 
; Open the packed file
If OpenPack(0, "mycompressedfiles.zip")
 
  ; List all the entries
  If ExaminePack(0)
    While NextPackEntry(0)
      Debug "Name: " + PackEntryName(0) + ", Size: " + PackEntrySize(0)
    Wend
  EndIf
 
  ClosePack(0)
EndIf


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Вс мар 05, 2017 6:38 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 578
Благодарил (а): 60 раз.
Поблагодарили: 18 раз.
Пункты репутации: 5
knower писал(а):
Или может какой создатель Chm-файлов есть, которому подсунул список, а он построил дерево.

Конечно есть, я использую очень старую версию плагина к тоталю и программу htm2chm, они немного по разному работают.
Вот только CHM, это упакованный HTML, а у тебя текстовые файлы.
Дерево создаётся из заголовков HTML файлов с сохранением вложенности папок.
Совсем недавно видел проги создающие из ТХТ -> HTML, не качал, не пробовал.

zip и chm, смысл один, взять кучу файлов и запаковать в один с возможностью просмотра всех вложенных файлов.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Вс мар 05, 2017 6:48 am 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 147
Благодарил (а): 74 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Цитата:
Или может какой создатель Chm-файлов есть, которому подсунул список, а он построил дерево.

в проге AmlPages (версия 9.19 бесплана:) можно сделать дерево, просто указав кучу файлов (txt, asm, pb - любых текстовых).
На выходе генерируется один файл в своём формате: либо текстовый со служебными тегами, либо сжатый пошифрованный.
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Вс мар 05, 2017 8:18 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 397
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 10
Ого...
newJS, bizdon, спасибо за советы по сторонним программам. Тем более не абы какие (что первое поиск выдаст), а проверенные на личном опыте. Ценно! Но всё же задача сделать на PB, а их пока что отложим в сторонку и будем держать в памяти.

Пётр, это всё конечно замечательно, только немного не то. Ведь дерево создаётся единожды и больше не изменяется. Вы же предлагаете каждый раз сканировать структуру папкок (только уже упакованную). Или не правильно понял? Я ведь не зря упомянул тут код просмотра ини. Нужно в файле оглавления (или как его ещё можно назвать) хранить как само дерево, так и ссылки на конкретные файлы в архиве (полный путь). И при каждом запуске программы строить дерево уже из этого файла. При перемещении же по нему распаковывать и открывать тот или иной файл. То есть в любом случае потребуется пара: ключ-значение (ветвь/узел-путь до файла). Как такое сохранить? Или это сложнее, а проще как Вы говорите? Здесь кстати не так давно поднимался вопрос о максимальном объёме ини.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: TreeGadget
СообщениеДобавлено: Вс мар 05, 2017 12:42 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
knower писал(а):
Как такое сохранить?
Это нужно?
Код:
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
Structure FileList
  N.s ; Имя файла
  S.q ; Размер файла
EndStructure
 
Structure TreeFiles
  DN.s                ; Имя текущей папки.
  List D.TreeFiles() ; Список вложенных папок текущей папки.
  List F.FileList()  ; Список файлов текущей папки.
EndStructure
 
EnableExplicit
 
Procedure ScanDisk(*Tree.TreeFiles, Dir.s) ; Сохранение структуры указаной папки
  Protected ID, Name.s
 
  If *Tree
   
    ID = ExamineDirectory(#PB_Any, Dir, "*.*")
    If ID
     
      While NextDirectoryEntry(ID)
       
        If DirectoryEntryType(ID) = #PB_DirectoryEntry_File ; Файл
         
          If AddElement(*Tree\F())
            *Tree\F()\N = DirectoryEntryName(ID)
            *Tree\F()\S = DirectoryEntrySize(ID)
          EndIf
         
        Else ; Папка
         
          Name = DirectoryEntryName(ID)
          If Name<>"." And Name<>".."
           
            If AddElement(*Tree\D())
              *Tree\D()\DN = Name
              ScanDisk(*Tree\D(), Dir+Name+"\") ; Рекурсивный вызов процедуры
            EndIf
           
          EndIf
         
        EndIf
      Wend
     
      FinishDirectory(ID)
    EndIf
   
  EndIf
 
EndProcedure
 
Procedure SetTreeGadget(Gadget, *Tree.TreeFiles, Depth)
 
  If *Tree
   
    If *Tree\DN<>""
      AddGadgetItem(Gadget, -1, *Tree\DN, 0, Depth)
      Depth+1
    EndIf
   
    ForEach *Tree\D()
      SetTreeGadget(Gadget, *Tree\D(), Depth)
    Next
   
    ForEach *Tree\F()
      AddGadgetItem(Gadget, -1, *Tree\F()\N+"    ("+*Tree\F()\S+")", 0, Depth)
    Next
;    
  EndIf
EndProcedure
 
Define Tree.TreeFiles
 
ScanDisk(Tree, #PB_Compiler_Home)
 
If OpenWindow(0, 0, 0, 500, 300, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 0, 0, 500, 300)
  SetTreeGadget(0, Tree, 0)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Сохранение/загрузку структуры Tree из файла или памяти можно произвести функциями JSON или XML.
Нужны функции типа CatchJSON, LoadJSON, SaveJSON, InsertJSONStructure, ExtractJSONStructure и т. д.

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 95 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.

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


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

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


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

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