AutoHotkey Community

It is currently May 26th, 2012, 7:02 pm

All times are UTC [ DST ]




Post new topic Reply to topic  [ 93 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7  Next
Author Message
 Post subject:
PostPosted: May 18th, 2009, 11:18 pm 
Offline

Joined: November 24th, 2007, 9:07 pm
Posts: 774
Perfect, once I get my hands on it and start trying it out, I'm sure I'll have a few questions to clarify :)

Thanks to your changes with Dictionaries and Interfaces, and your other past semi-recent changes, I'm finishing up several supporting classes for use in other projects. This is by no means a definitive list, but just to give you an idea where your class library is helping me now:

- Notifier class which facilitates user notifications, and separates the notification data from the actual display of the notifications (allows specifying custom NotificationHandlers)
- Config class which wraps the IniFile and DOM classes and separates configuration information from the format it's actually defined in (allows full sub-paths in Ini files as well as XML, default values, etc.)
- Log class is being expanded to work a bit more like L4j ... log categories and log levels, among other enhancements.
- DOM class is made up almost entirely of interfaces, and much of the code is complete, so soon AHK will have a full DOM implementation thanks to Class. The XML class will follow shortly after, and hopefully the SAX class to support SAX parsing of XML documents.
- GUI class is just about ready for initial release, pending my adding the Dictionary_getKeys() sections in there to finish up its functionality.
- My Bencode library (and subsequently the Torrent library) is finally being turned into a Class and expanded to be fully OO... now that Dictionaries are fully supported, it will be much simpler.
- Installer class is almost ready pending release of my DOM class to support XML installer definitions.
- Tray class is underway, facilitating cool new features for the TrayIcon (such as status icons including priorities and queues) and the tray menu (utilizing your menu wrapper of course :))
- Schedule class which allows custom and open definitions of scheduled functions or processes and manages the timers or user actions required to execute the scheduled tasks
- FTP class I created for a script at work which uses Windows DLL functions to open and manage an FTP connection, get/put files, etc.
- Game class, along with the GameMod class and all supporting classes, support a lot of functions for organizing, tweaking, and managing a game's files and mods.
- SteamLab, my long-standing and still-unreleased library facilitating creation and management of Steam-like windows in AHK, is getting turned into a Class and making use of many of my other classes to provide advanced functionality.

And I've got a lot more planned and in development. Unfortunately I haven't had much time for testing of the classes, so I haven't released much to the public yet. Since I'm using most of the classes in my Fallout 3 Mod Sorter (FOMS) project, I should be able to test them prior to the next FOMS release and get the individual classes posted in the forums here.

Just wanted to again show my gratitude for this amazing "magic" library :) Hopefully your and my current and future classes will help spark additional class development in the community.

_________________
Ben

My Trac projects
My Wiki
[Broken] - My music


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 18th, 2009, 11:38 pm 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
Have you noticed any "lagging" when using the Class library? For example, I tried to make a Tree class ,but it couldn't create the Classes fast enough. It worked, but could only add 200 folders a second - which is way too slow for practical uses. I haven't isolated the exact problem, but I know part of it is rooted in setting values - hence why creating a "recursive class" (typical Tree implemention is recursive) is way too slow.

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 19th, 2009, 1:03 pm 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
I just realized how to implement single inheritence that will be backward compatable, and not require any modifications to existing code or require anything "special" in future code. The only thing "special" necesary is that functions that should be non-virtual would need to add a little code - by default, functions are virtual. Also, the indexes for the subclass will need to be adjusted, but there will be a function that will handle this.

My idea how to handle indexes will solve a an "annoyance" with the current setup From my testing, it seems that the current index system is inefficient. This could be partly to blame because I currently use a RegEx to parse the value. My solution is to "cache" the indexes. This should not only speed up current accesses, but will also enable inheritence. Since the index must be relative to the base class, the index will be computed at run-time (using the current base class' size, including user-defined values). Also, project to project, the size of the user-defined size may change - my solution accounts for this.


In general, inheritence "partions" the values in a "class chain". This partioning means that the getters and setters will function without requiring any changes. For example, when passing a class object (or any of its subclasses) to a getter / setter, the getter / setter will function like would be expected from any OOP language.

The indexing would be cached in the getBuiltInValues / getUserDefinedValues function. It would add a parameter (variableName). The default value would be the empty string. If the empty string is passed (or the parameter is omitted), the current behavior would be done (the list of values would be returned). If a variable name is specified, the index for that variable would be returned. This index can be directly passed to the get/setValue function (or get/setString, get/setSString).

Code:
;example of its use
Node_getMyValue(NodeObject) {
    return Class_getValue(NodeObject, Node_getBuiltInValues("myValue"))
}
Node_setMyValue(NodeObject, MyValue) {
    return Class_setValue(NodeObject, Node_getBuiltInValues("myValue"), MyValue)
}



The index values would be set once on first run (along with the list of built-in values, which is currently done). I'll give an example of how to do this along with the modified Node.ahk file when I get the details perfected. The returned index would have this form: byteOffset.bitOffset. Since this won't cause ambiguity with the current indexes, and it is very easy to extract the two parts using string manipulation, this method should be very efficient. bitOffset is zero if there is no bit offset, and non-zero if there is one.

This method should make for neater code - as the actual index is stored internally and retrieved via the variable name. Inside the getBuiltInValues function, the indexes will be stored in static values (similar to the constant function). There will be no need to specify a variable as read/write or read-only. But, you will still need to specify the value in the list.

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 19th, 2009, 5:10 pm 
Offline

Joined: November 24th, 2007, 9:07 pm
Posts: 774
Sounds like a great idea! Eagerly awaiting this release... :)

And yes, for large recursive operations I have had speed issues. For most of my purposes it's reasonable, but you're right, when creating huge numbers of objects (eg. getting and setting huge amounts of values), there is a very noticeable slowdown.

_________________
Ben

My Trac projects
My Wiki
[Broken] - My music


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 22nd, 2009, 9:22 am 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
Ok, I'm heading off to sleep. I've been copying and pasting for most of the day. However, the fruit of that labor is that I updated the Array and Vector functions. They aren't on the site yet, because I still have a little more touching up to do. Interfaces are done, but I need to give it one final check to make sure I didn't leave something I shouldn't have. I'm going to do that tomorrow though, I'm tired.

However, I do have an extra special treat for you all (yeah... it sounded just as bad and corny in my head... but, it's true). I "found" an Introduction to OOP lying on my computer (ok... so, I forgot about it). My memory problems are your gain, though. I uploaded it to the site, see the nice new first link - check out the website.

So, hopefully that will tide you all until I get Interfaces uploaded tomorrow. I have some more updates that I'll be mentioning tomorrow as well, but, I'll leave you all in suspense - I'll tell you when they're up. Night :twisted:. Oh, :P

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 23rd, 2009, 9:57 am 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
OK, finally got everything uploaded. Many additions were added in this release. See the below list for the complete list of changes. I also added pages for all the missing search functions (in Array and Vector).

Download the updated class library.


A great addition has been made to AccessClassLibrary. Now, it makes use of a modified version of Intellitype. It has all page "anchors" (e.g. page#anchor), so this can be useful to navigate the sections on a page (the old version still exists - using the drop down list). Also, all function names are stored as well. A tooltip with the matching anchors / functions appears when the input has either a "#" or a "_". If you tab to the drop down box, then the tooltip will vanish. It only monitors the gui that shows when pressing the hotkeys, so it won't interfer with your other work.

Download the updated AccessClassLibrary (includes the latest version of the Browser class).

Edit:
In all the confusion, I forgot to mention that knowing me, I probably forgot something - especially because how much copying and pasting I did in the last few days. So, if there are any bugs in the code or on the site, please tell me, and I'll fix them. Thanks.

Revision2 - May 23, 2009
  • Add: An introduction to OOP - explains traditional OOP and shows how to adapt it to AHK OOP
  • Add: Interfaces. There is an example interface Coin, and an example of it Coin_test (located in the "Class examples" folder).
  • Add: The List interface - Array and Vector both implement the List interface.
  • Add: The Class_setConstants function - Get / set multiple constants at a time
  • Add: Constructors Array_new1 and Vector_new1. Each take a single parameter, a List object, and creates a new Array / Vector from the existing List.
  • Mod: The Node_new function has been refactored to facilitate making classes with multiple constructors.
  • Mod: AccessClassLibrary has been updated with the new list of functions. Also, I incorporated a sligtly modified version of Intellitype. Every function and "webpage anchor" (webpage + stuff after the "#") is loaded via the included ClassLibraryFunctions.txt. A tooltip will appear if the inputted page contains a "_" or a "#" and shows all matching pages. Make a selection by typing twice (in quick selection). For example typing "1" twice will make the first selection.
  • Mod: modified Class_getValue and Class_setValue so that the value of ErrorLevel is preserved. Both functions make calls that modify ErrorLevel is undesired ways. This means that if a function were to set ErrorLevel, and called either function afterwards (e.g. to return a field), then ErrorLevel would be modified unintentially.
  • Fix: Shallow clones now correctly work. To perform a shallow clone, specify False (0), or the empty string for the deep copy parameter in a class' clone function (the Class must be cloneable). A shallow copy is identical to a deep copy, except that obj types are copied (not cloned) - the lock count will be increased by one to reflect being stored in an additional location.
  • Fix: When setting an robj type (e.g. via the Array_replace and Vector_replace), if the new object was identical (same address) as the old value, the function would (incorrectly) return false (0). It now correctly returns the previous object.

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 23rd, 2009, 5:50 pm 
Offline

Joined: November 24th, 2007, 9:07 pm
Posts: 774
Can one interface inherit from another interface?

To go back to my DOM examples, DOMNode is a base interface used by most of the other DOM interfaces.

For instance, the DOMElement interface represents an element, and inherits from the DOMNode interface.

Is there an easier way to do this now that interfaces exist, than just making a DOMNode object one of the fields and adding helper functions to get and set the DOMNode fields, as I was doing before?

btw, working on converting all my classes which should be interfaces to actually be... much thanks for the additions to the Class library and other changes!

_________________
Ben

My Trac projects
My Wiki
[Broken] - My music


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 23rd, 2009, 6:25 pm 
Just dropped in to say thanks on behalf of the community for your constant effort! Much appreciated!! 8)
Now, after you've provided: ... it looks like I've to dig into that OH .. OH .. Pee... ing thing :shock: (erm, I'm running out of excuses) :D

Thx man 8)


Report this post
Top
  
Reply with quote  
 Post subject:
PostPosted: May 23rd, 2009, 6:36 pm 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
bmmclure wrote:
Can one interface inherit from another interface?

Does nothing satisfy you?? :D

It depends on your needs and what you mean. Inheritance, in general, is not yet supported. So, my answer would be no. However, it may be possible, depending on your needs, to provide the functionality with the current system. I'm giving thought on how to add inheritance (general purpose inheritance), so my answer will change slightly and lean to a maybe / not yet.


For general inheritance, there are two more aspects which are needed (I have an idea of both - just working the logistics and trying to minimize dynamic calls, so not to bog down inherited classes). The first aspect is the "inheritance chain". For example, if ClassC inherits ClassB, and ClassB inherits ClassA, then ClassC inherits ClassA (indirectly); a similar logic applies to classes. For this, I plan on using the initClass function. Then, another function would create the "inheritance chain" and store this along with the class name value. In other words, the ClassName value (located in the initClass function) will be built (creating a cache of all implemented interfaces (and their "ancestors") as well as the extended class (if any) and its "ancestors"). This addition will be part of the V3 design. It will be designed so that a class can easily be superclassed and easily extend another class (likewise, for interfaces and extending other interfaces).

The second thing that is required is to partition the indexes in a class object. Each inherited class in the the "inheritance chain" would have it's own partition - with the first partition being the base class. This way, no modification would be required to the getters and setters, and passing a subclass object would work as expected. I plan to do this by overloading the getBuiltInValues and getUserDefinedValues functions. They will be overloaded to return the index of the passed field. These indexes will be used in the getters, setters, and wherever else the index of the field is used. Additionally, they will be cached, for performance reasons (using a similar structure used in the constants function).


I'm giving this area thought, but I need a break from coding the class library. Truthfully, I cannot devote the energy you may want, because I need to find a job, get an apartment, and move on with my life. Combine this with the fact that I'm already bored with the class library due to most details being more work to document than to code. For example, interfaces were done a month ago, but I kept getting distracted and bored, and forgot to document them. These last few days I've been copying and pasting about 6 hours each day (give or take) to get the documentation to where it is. So, simply put, it's not nearly as challenging as I would like, and I, financially, am getting no benefit (even if I were, it wouldn't be enough to live off of) - as such, I need to find a job. If you then factor in my personal situation, I would be the one paying you to hear me babble. As such, I'll leave that topic alone.


In review, I'm looking at how to add inheritance, and the idea is in my mind, but it's going to be a while before it's done. I'd be fine if someone offered to add this feature for me, but I think that request might fall on deaf ears. Truthfully, I wonder how many ears besides our two are actually listening in on this conversation. No offense, but combine my boredom with the lack of use of this library, and the end result is I would love to throw this library away - I'm to the point I wish I never wrote this library. Also, to prevent confusion, even if it had more support, systematically programming OOP isn't really part of my skill set. I love algorithms, but I never once thought about writing my own OOP language - however, as irony would have it, that's essentially what I'm doing. I'm writing an OOP language on top of a non-OOP one.

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 23rd, 2009, 6:58 pm 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
Another quick fix. I realized that I forgot to increase the lock count when deep cloning an object - oops. I added the missing line of code - download the updated class library. Sorry about that.

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 23rd, 2009, 7:09 pm 
Offline

Joined: November 24th, 2007, 9:07 pm
Posts: 774
Did you at least call the Class_closeEars function before talking about your child like that!? :)

Just so you know (I'm sure you already do), I really appreciate what you've done already, and if you stopped developing this library entirely, it would still be incredibly useful for my continued AHK development.

I completely understand the frustration, and your need to take a break from developing the library. I understand that true inheritance isn't available right now, and that's fine--I'll work around it.

I think with your latest documentation work, and with all the classes currently in development, even if it is just us who have been developing classes, the library will definitely gain visibility and hopefully more developer support.

Most AHK developers don't grasp OOP completely, or just don't practice it regularly--it takes sort of a leap to understand how OOP can fit into AHK. Once you get it, however, you realize that it can be truly powerful. I think if we can get more people to that point, it could really take off.

I realize I'm fairly new to OOP, but I really like your ideas, and I would be happy to put some time into developing and/or documenting the Class library and its supporting classes. It's yours, so I wouldn't want to just go off on a tangent adding things it doesn't need, but I'm more than happy to put some hours into implementing or documenting the things we've discussed. It would definitely help familiarize me with the library's internals and provide some interesting challenges to overcome.

In fact, if you're not wanting to put the work into maintaining things by yourself, I'd be happy to host the class library at SingularityShift (www.singularityshift.com). It would get its own Wiki, SVN repository, and Trac site (for bug and release tracking). It would make it simple to request features and manage the development process, and would have all the benefits of version control allowing other people (me :) ) to contribute without worrying about screwing anything up. It would also make it easy for the community to contribute to documentation. You may have your development environment already set up how you want it for the library, but it's just an offer if it turns out you don't have the energy or desire to continue maintaining things.

Thanks again for all your hard work, and do let me know if there's anything I can do to help keep this project going.

Good luck with your personal situation, by the way--my girlfriend and I just had to move out to Portland for my job, and I know it's difficult and time-consuming making such big life/job changes.

_________________
Ben

My Trac projects
My Wiki
[Broken] - My music


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 23rd, 2009, 7:51 pm 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
bmmclure wrote:
Did you at least call the Class_closeEars function before talking about your child like that!?

I tried to tell my child that my inheritance won't be available until after I died, but they just screamed and screamed saying stuff like "I want your inheritance now!" (don't they realize I would have to die first) :D

bmmclure wrote:
Just so you know (I'm sure you already do), I really appreciate what you've done already, and if you stopped developing this library entirely, it would still be incredibly useful for my continued AHK development.

Thank you. I know my work is appreciated. It is this that drives me to continue working on it (at my own pace) even though it frustrates me to no end at times.

bmmclure wrote:
Most AHK developers don't grasp OOP completely, or just don't practice it regularly--it takes sort of a leap to understand how OOP can fit into AHK. Once you get it, however, you realize that it can be truly powerful. I think if we can get more people to that point, it could really take off.

I couldn't agree more. Hopefully the Introduction to OOP that's now available can help with both of these struggles. I fully understand that as frustrating it may be to me, it's probably much more frustrating to those that are reading this, but unable to use this "amazing" tool. I mean, how we go on about it, it sounds like something one can't live without.

I can only imagine how all the users that cannot use this feel. I mean there are 13000+ views on the topic in the scripts and functions and 2000+ here. The fact that most conversations are between us two means that there are 14998+ people (since you are a viewer on both, and counted twice) that are "lost" or otherwise unable to use this library (or they all understand it; maybe they can share their wisdom with the rest of the class :D). So, trust me, my anguish results more because I feel powerless, than because I feel worthless or unappreciated. I have no idea how to share my love of OOP with others, and I have no idea what lacks in the description, implemention, and whatnot that would facilitate this process. There are obviously many that want to learn, but cannot - it is this fact that troubles me the most.

bmmclure wrote:
I would be happy to put some time into developing and/or documenting the Class library and its supporting classes. It's yours, so I wouldn't want to just go off on a tangent adding things it doesn't need, but I'm more than happy to put some hours into implementing or documenting the things we've discussed. It would definitely help familiarize me with the library's internals and provide some interesting challenges to overcome.

I think the best thing that can be done is examples and tutorials. Now that I'm starting to catch up, I'm going to start adding the classes you PMed me and check the forum for any classes. As a note, please include "[Class]" in the title so that it is obvious that you are posting a class.

Another thing that will help is writing tutorials. I think this provides a way to learn and teach all in one. If you find a tutorial on OOP, and want to explain the AHK equivalent, feel free to write one up. I will gladly link to it, giving propper credit. The length of the tutorial is not what's important. It is the fact that there is another example of OOP.

As has been mentioned before, part of the problem is that many users don't know OOP. The other problem is the ones that do, don't know how to apply their OOP skills to AHK OOP. I think that tutorials and examples will provide ways to learn and to teach, and provide everyone with more knowledge.

bmmclure wrote:
In fact, if you're not wanting to put the work into maintaining things by yourself, I'd be happy to host the class library at SingularityShift (www.singularityshift.com). It would get its own Wiki, SVN repository, and Trac site (for bug and release tracking). It would make it simple to request features and manage the development process, and would have all the benefits of version control allowing other people (me) to contribute without worrying about screwing anything up. It would also make it easy for the community to contribute to documentation. You may have your development environment already set up how you want it for the library, but it's just an offer if it turns out you don't have the energy or desire to continue maintaining things.

If you don't mind, sure. I have no idea what half of what you are talking about is, but if you think it would help, I won't turn away a helping idea. As far as my IDE, I use PSPad to keep this mess of a library in order. It supports projects, so I have all my classes kept in one project. It supports folders, has syntax highlighting, and even a built-in webpage viewer. It's free and portable, which are both requirements for any software I intend to use regularly.

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 24th, 2009, 12:16 am 
Offline

Joined: November 24th, 2007, 9:07 pm
Posts: 774
No prob, I've got bash scripts set up on my server that let me create new projects in seconds :)

Trac site: http://trac.singularityshift.com/projects/classlibrary
SVN Repo: http://svn.singularityshift.com/svn/classlibrary/
Wiki Section: http://wiki.singularityshift.com/wiki/C ... assLibrary

Some quick info for you, and anyone looking to contribute:

TRAC
This is where anyone can create and track tickets, and you can track development tasks, feature requests, versions, release dates, etc. It also has a wiki built in that is great for keeping development notes. You can customize the front page of the Trac site with anything you'd like.

Click Register to create an account there. That same account should be good for the Subversion repository as well. I can turn your account into a Trac admin for your site, as well, to give you some additional backend options.

SVN
If you haven't used Subversion, I'd recommend first checking out a tutorial, then installing TortoiseSVN. Perform a checkout on http://svn.singularityshift.com/svn/classlibrary/trunk/ (should be empty right now) , then put your project files there and commit them. From then on out you can always check out the latest version (or any previous revision), and commit your changes without having to worry about losing anything ever.


WIKI
Create any documentation pages you'd like using Wiki markup (or just a page linking to the documentation), and at the bottom just use the following markup to attach it to the ClassLibrary category:
Quote:
[[Category:ClassLibrary]]


If you'd like, I can also create a new Wiki site for the project. Currently it's just a section of the existing Wiki, however.

HOSTING
I can also host web space for you aside from this, if you want to move the static pages or host any other content. I can easily create a new subdomain for you if you'd like (classlibrary.singularityshift.com?) to facilitate this.

Of course I don't want to force any of these concepts on you if you're not interested, but I think if we put Trac and SVN to use at least, continued expansion and development of the Class lib should be more easily accomplished.

_________________
Ben

My Trac projects
My Wiki
[Broken] - My music


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 24th, 2009, 11:25 am 
Offline

Joined: November 24th, 2007, 9:07 pm
Posts: 774
Wondering what to do from a best-practices perspective if an interface and a class would both share the same name. Would I change the interface to have a more descriptive name (DOMDocumentInt instead of DOMDocument or something?), or would I change the class name itself that utilizes the interface?

Sorry if the question is silly, but I want to get the lib names correct so I don't need to change them after release.

_________________
Ben

My Trac projects
My Wiki
[Broken] - My music


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: May 24th, 2009, 11:57 am 
Offline

Joined: November 4th, 2008, 9:23 am
Posts: 1045
My suggestion is to use the same name, with an "I" appended (for interface). Maybe that will cause confusion, not sure, but I think it's logical. Personally, I see "int" and think integer - so DOMDocumentInt causes my head to spin. As you can tell with my other uses (Dictionary vs SDictionary, Class_call vs Class_Scall), I like single letter alternatives, when possible. To me, it reminds me of an acronym. So, SDictionary is a (case-Sensitive) Dictionary, Class_Scall is a (Static) call, and DOMDocumentI is a DOMDocument (Interface).

_________________
As always, if you have any further questions, don't hesitate to ask.

Add OOP to your scripts via the Class Library. Check out my scripts.


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 93 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: dra, Exabot [Bot], rbrtryn and 59 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group