Jump to content

Neutral General

  • Content Count

  • Joined

  • Last visited

Community Reputation

10 Good

About Neutral General

  • Birthday 09/14/1988

Technical Information

  • Delphi-Version
    Delphi 10.0 Seattle

Recent Profile Visitors

61 profile views
  1. Neutral General

    IDE Fix pack for Rio

    Well yes.. but it's also sad that they couldn't (wouldn't?) fix those bugs for like a decade. And for a company selling a compiler + IDE I expect them to be able to fix such bugs themselves. And even if they didn't know how to do it themselves, why didn't they include the IDEFixpack earlier? The IDEFixpack existed for many years before they decided to include it. Now that they've included it, they only seem to have included very minor fixes, because you STILL need to install the 3rd party IDEFixpack for the IDE to be somewhat stable. So to be honest I'm not really that hopeful anymore. I'd really like for Emba to (positively) surprise me with 10.4, but I'm not getting my hopes up.
  2. Neutral General

    Rio quality disappoint

    For a while a colleague wrote his code in Notepad++ and copy&pasted it into the Delphi IDE, because Code Insight didn't do anything but randomly make the IDE unusable and unresponsive for up to 30 seconds. He literally couldn't do his work with 10.3. After installing the dev snapshot of the IDE Fixpack it's a lot better now and it's at least usable again. But it's still not acceptable that the IDE is in a state where some people are faster writing code in Notepad than in "RAD" (😂) Studio without disabling themes and a lot of IDE Insight features and having to install a third party patch before being remotely usable. And the worst thing is: a lot of the performance and stability problems exist for nearly a decade at this point
  3. Neutral General

    Debugging multiple DLLs simultaneously

    I've got an application (windows service) that (in the best case) shouldn't be shutdown ever. But there are going to be updates to the application. So in order to not have to shut down the whole service, the service is modular and can just temporary unload a DLL, update and then reload it. That's not really doable with a monolithic application.
  4. Neutral General

    Debugging multiple DLLs simultaneously

    Thanks! 🙂 That's still not the holy grail but a lot better than a message box. 👍
  5. Neutral General

    Debugging multiple DLLs simultaneously

    That's not the reply I was hoping for but I guess there's no better way to do it 😞
  6. Hello, I've got an application which dynamically loads multiple DLLs from my project group. All those DLLs are exposing a small API they use to communicate with each other (and the exe). Debugging what happens inside a DLL isn't a problem. I can just attach the debugger to the process and it works. But what do I do if I'm in a debugging session in foo.dll with a break point on an API function calling code in bar.dll I would like to step into this function but I don't really know how I could do that. My first plan was to stop at a breakpoint on the call, detach the debugger, switch projects and reattach it to bar.dll so I can debug the inside of the call. But as soon as I detach the debugger, the process just continues execution. Does anyone know a good solution to this?
  7. Neutral General

    Editing binary files in Delphi

    "Simple" is an understatement You can pretty much type any character you want wherever you want. It just throws an error if you want to save it and it isn't valid.
  8. Neutral General

    Strange thing in System.Generics.Defaults.pas

    Because 42 is the answer to the ultimate question of life, the universe and everything
  9. Yes. I set a breakpoint and before that a ShowMessage in the destructor of the menu items. The old ones get destroyed if a new popup menu is created. I'll take a look at the link, thanks! :)
  10. I've tried using an interface for the menu item, but it didn't change anything and every code about this I found also always used object variables so I assumed that this would be okay. Currently my menu notifier also has some other functionality. Implementing the Notifier interface is just one thing it does. But maybe I should use a dedicated notifier object and include my main plugin logic in another class?
  11. Hi, I'm trying to write an IDE plugin which extends the popup menu of a project. This is a rough overview of my code: TMyProjectMenuItemNotifier = class(TNotifierObject, IOTANotifier, IOTAProjectMenuItemCreatorNotifier) // ... TMyProjectMenuItem = class(TInterfacedObject, IOTANotifier, IOTALocalMenu, IOTAProjectManagerMenu) // ... { TMyProjectMenuItemNotifier } procedure TMyProjectMenuItemNotifier.Initialize; var manager: IOTAProjectManager; begin if Supports(BorlandIDEServices, IOTAProjectManager, manager) then FProjectNotifierId := manager.AddMenuItemCreatorNotifier(Self); end; procedure TMyProjectMenuItemNotifier.Finalize; var manager: IOTAProjectManager; begin if (FProjectNotifierId > -1) and (Supports(BorlandIDEServices, IOTAProjectManager, manager)) then manager.RemoveMenuItemCreatorNotifier(FProjectNotifierId); end; procedure TMyProjectMenuItemNotifier.AddMenu(const Project: IOTAProject; const IdentList: TStrings; const ProjectManagerMenuList: IInterfaceList; IsMultiSelect: Boolean); var item: TMyProjectMenuItem; begin item := TMyProjectMenuItem.Create(Project); item.Caption := 'Test123'; item.Enabled := true; item.Position := 0; ProjectManagerMenuList.Add(item); end; { TMyProjectMenuItem } procedure TMyProjectMenuItem.Execute(const MenuContextList: IInterfaceList); begin ShowMessage('Click!'); end; // Unit which creates and registers all the classes var projectItemNotifier: TMyProjectMenuItemNotifier; procedure Register; begin projectItemNotifier := TMyProjectMenuItemNotifier.Create; projectItemNotifier.Initialize; end; initialization finalization projectItemNotifier.Finalize; In general all this works well so far. There's just one problem: It seems like the TMyProjectMenuItem-Objects are not destroyed on closing the Popup-Menu but on opening the next one. This somehow ends in the following order of events. 1. Build MyPlugin.bpl => Success 2. Install MyPlugin.bpl => Success 3. Right click on my project a) TMyProjectMenuItem is created b) Popup menu shows and my menu item works as expected 4. I close the popup menu 5. I right click on my project (again) a) Prior TMyProjectMenuItem is destroyed b) New TMyProjectMenuItem is created 6. I choose "Uninstall" a) TMyProjectMenuItemNotifier.Finalize is called b) TMyProjectMenuItemNotifier is destroyed 7. I right click on my project (again!) 8. I right click on my project (one last time) => Success. The popup menu with the default items shows The TMyProjectMenuItem from my last click before the uninstall never gets destroyed and it seems like the IDE doesn't know the item is gone either and I get this access violation when the IDE tries to access (and destroy) the last TMyProjectMenuItem. And at this point I'm clueless. I don't know how I'm supposed to fix that. There is no Interface or Method to manually unregister/destroy the object so that the IDE knows it's gone. I'm using Delphi 10.0 Seattle on Windows 10
  12. Neutral General

    Chrome/TamperMonkey for Design

    I can't edit my post above so here's a fixed version: // ==UserScript== // @name [DPE] CSS Overrides // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author You // @match https://en.delphipraxis.net/ // @match https://en.delphipraxis.net/?* // @match https://en.delphipraxis.net/topic/* // @match https://en.delphipraxis.net/discover/* // @grant none // ==/UserScript== (function() { try{ 'use strict'; // Header const enable_compact_banner = true; const enable_compact_searchbar = true; // thread overview const enable_compact_topic_banner = true; const enable_modified_topic_banner = true; const enable_compact_fluidlist = true; const enable_additional_highlight = true; // Threads/Posts const enable_small_userinfo = true;  const enable_compact_comment = true; const enable_compact_comment_footer = true; const enable_compact_pre = true; const enable_compact_code = true; const enable_compact_survey = true; const enable_username_above_avatar = true; // Other const enable_goto_latest_post = true; const enable_scroll_to_content = true; const enable_compactDiscover = true; const isDiscover = location.href.indexOf('delphipraxis.net/discover') > 0; const $ = jQuery; const stylesheet = document.styleSheets[document.styleSheets.length - 1]; if (enable_compact_banner) { $('HEADER .logo').attr('style', 'height: auto;'); $('HEADER .logo IMG').attr('style', 'margin-bottom: -30px;'); } // fluid list if (enable_compact_fluidlist && !isDiscover) { $('LI.ipsDataItem').attr('style', 'padding: 2px 0'); $('DIV.ipsDataItem_icon').attr('style', 'padding: 0 10px;'); $('DIV.ipsDataItem_main').attr('style', 'padding: 0;'); $('UL.ipsDataItem_stats').attr('style', 'padding: 0 10px 0 0;'); } if (enable_goto_latest_post) { $('LI.ipsDataItem_unread DIV.ipsDataItem_main A[href*=topic]').each(function() { const href = $(this).attr('href'); if (href.indexOf('?') < 0) $(this).attr('href', href + '?do=getNewComment'); }); } const ipsPageHeader = $('DIV.ipsPageHeader'); if (enable_compact_topic_banner) { ipsPageHeader.attr('style', 'padding: 5px;'); } if (enable_modified_topic_banner) { if (!isDiscover) { const topicControls = ipsPageHeader.next(); const topicControlsLinks = topicControls.find('A'); for (var idx = 0, link; link = topicControlsLinks[idx]; idx++) { if ($(link).closest('FORM').length > 0) continue; const div = $('<div class="ipsPos_right ipsResponsive_noFloat ipsResponsive_hidePhone" style="margin-left: 5px;"></div>'); link.style = 'padding: 5px; line-height: 1.5em;'; div.append(link); ipsPageHeader.prepend(div); } } } if (enable_username_above_avatar && !isDiscover) { var authorOriginal = $('.cAuthorPane_author > strong > a'); authorOriginal.each( function(i, obj) { var txt = obj.innerHTML; var list = obj.parentElement.parentElement.nextSibling.nextSibling; list.innerHTML = '<li><strong>' + obj.outerHTML + '</strong></li>' + list.innerHTML; obj.outerHTML = '<span style="color: #346f99;">.</span>'; }); } if (enable_small_userinfo) { $('UL.cAuthorPane_info').attr('style', 'transform: scale(0.6); padding: 0; margin: -40px;'); } if (enable_compact_comment && !isDiscover) { $('DIV[data-role="commentContent"]').attr('style', 'padding: 0; font-size: small;'); } if (enable_compact_comment_footer && !isDiscover) { $('.ipsItemControls').attr('style', 'line-height: 25px; height: 25px;'); $('.ipsComment_controls').attr('style', 'line-height: 25px; height: 25px;'); $('.ipsReact_types').attr('style', 'transform: scale(0.75);'); } // Code if (enable_compact_code && !isDiscover) { $('PRE.ipsCode').attr('style', 'padding: 5px !important; font-size: small;'); } if (enable_compact_pre) { stylesheet.insertRule('PRE.ipsCode { max-height: 15em; }'); stylesheet.insertRule('PRE.ipsCode.viewAll { max-height: inherit; }'); stylesheet.insertRule('.codefold { right: 0; position: absolute !important; margin-right: 3em; }'); const a = $('<a href="javascript:void(0);" class="codefold" onclick="$(this).parent().toggleClass(\'viewAll\');">open/close</a>'); $('PRE.ipsCode').prepend(a); } // Survey if (enable_compact_survey && !isDiscover) { $(':root').attr('style', '--grid-gap: 0px;'); $('span.ipsFaded').attr('style', 'margin-left: 5px;'); } if (enable_additional_highlight) { // Highlight subforum in post listing (fluid list) $('.ipsDataItem_meta > a[href*="?forumId="]').css({ color: '#4D7395' }); // Highlight user in post listing (fluid list) $('.ipsDataItem_meta > span > a[href*="/profile/"]').css({ color: '#4D7395' }); } // Compact search bar if (enable_compact_searchbar && !isDiscover) { $('.nav-bar').attr('style', 'height: 30px;'); $('.secondary-header-align').attr('style', 'height: 30px;'); $('.ipsNavBar_primary > ul > li > a').attr('style', 'line-height: 30px;'); $('.ipsfocus-search').attr('style', 'height: 30px; line-height: 30px;'); } stylesheet.insertRule('.ipsDataList.ipsDataList_zebra > .ipsDataItem { height: 45px; }'); if (enable_compactDiscover && isDiscover) { $('LI.ipsStreamItem').attr('style', 'padding: 2px 10px !important; margin: 0 0 2px 30px !important;'); $('LI.ipsStreamItem UL.ipsTags').each(function () { $(this).closest('DIV').find('H2').append($(this)); }); } // scroll to start of content if (enable_scroll_to_content) { if ((window.location.href.indexOf('?do') < 0) && window.location.href.indexOf('#') < 0) { $('html,body').animate({scrollTop: $('#elContent').offset().top},'slow'); } } } catch(e) { // I don't wanna hear about it } })();
  13. @Adz Baywes Did you try my fix I suggested in the post above? I can't test this right now. So I'd be thankful if you could just change this one line and test again.
  14. I've tested it with a small chrome window on windows 10. If some feature doesn't work on mobile or in some browser you can always just disable that specific feature. Should work just fine - especially for the username changes. Edit: Does it work if you change this line: obj.outerHTML = '&nbsp;'; to obj.outerHTML = '_'; ? Because I couldn't set outerHTML = '' because that gave me the effect you are getting in opera. In Chrome adding a space worked to mitigate this problem. Maybe Opera treats spaces a little bit different and you need to have something "real" in there.
  15. The username change doesn't seem to affect the mobile view: